LinearGradient和Matrix实现动态的文字闪烁效果
2016-07-05 16:33
501 查看
先看下效果
首先先看下LinearGradient
的实现
Android提供的Shader类主要是渲染图像以及一些几何图形。 Shader有几个直接子类:
BitmapShader : 主要用来渲染图像
LinearGradient :用来进行线性渲染
RadialGradient : 用来进行环形渲染
SweepGradient : 扫描渐变—围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。
ComposeShader : 组合渲染,可以和其他几个子类组合起来使用。
有两种不同的实现方法
简单的一种
Paint mPaint=new Paint(); LinearGradient lg = new LinearGradient(float x0,float y0,float x1,float y1,int color0,int color1,Shader.TileMode tile); mPaint.setShader(lg);
x0 渐变起点坐标x位置
y0 渐变起点坐标y位置
x1 渐变起终点坐标x位置
y1 渐变起终点坐标y位置
color0 渐变颜色起始色
color1 渐变颜色终止色
Shader.TileMode tile 平铺方式
复杂的一种
public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)
x0 渐变起点坐标x位置
y0 渐变起点坐标y位置
x1 渐变起终点坐标x位置
y1 渐变起终点坐标y位置
colors 渐变颜色数组
positions是定义每个颜色处于的渐变相对位置,这个参数可以为null,如果为null表示所有的颜色按顺序均匀的分布
Shader.TileMode tile 平铺方式
下面看下代码
其中最关键的是使用`getPaint()`方法获取当前绘制的TextVIew的Paint对象,并给这个Paint对象设置原生TextView没有的LinearGradient属性,最后在onDraw()中,通过矩阵的方式来不断平移渐变效果,从而在绘制文字时,产生闪烁效果,
里面的字体只循环闪烁三次
public class ShineTextView extends TextView { private LinearGradient mLinearGradient; private Matrix mGradientMatrix; private Paint mPaint; private int mViewWidth = 0; private int mViewHeight = 0; private int mTranslate = 0; int i =0; public ShineTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mViewWidth == 0) { mViewWidth = getMeasuredWidth(); mViewHeight = getMeasuredHeight(); if (mViewWidth > 0) { mPaint = getPaint(); mLinearGradient = new LinearGradient( 0, 0, mViewWidth, mViewHeight, new int[]{ Color.BLUE, 0xffffffff, Color.BLUE}, null, Shader.TileMode.CLAMP); mPaint.setShader(mLinearGradient); mGradientMatrix = new Matrix(); } } } private static final String Tag = "MSH"; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mGradientMatrix != null) { mTranslate += mViewWidth / 5; if (mTranslate > 2 * mViewWidth) { mTranslate = -mViewWidth; i++; Log.d(Tag,"第 "+i+" 次"); if (i==3) { return; } } mGradientMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(300); } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories