未经本人授权,不得转载!否则必将维权到底
先上效果图:
这是 AndroidStudio 里面预览布局的效果图,真实运行效果,大家一试便知。
实现代码如下:
自定义View,继承TextView
/** * Created by keithXiaoY */
// Java代码
public class CustomsTextView extends TextView {
private int mViewWidth = 0;
private TextPaint mPaint;
private LinearGradient mLinearGradient;
private Matrix mGradientMatrix;
private int mTranslate = 0;
public CustomsTextView(Context context) {
this(context,null,0);
}
public CustomsTextView(Context context, AttributeSet attrs) {
this(context, attrs ,0 );
}
public CustomsTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mGradientMatrix != null){
mTranslate += mViewWidth /7 ;
if (mTranslate > 2*mViewWidth){
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate ,0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
postInvalidateDelayed(50);
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if(mViewWidth == 0){
mViewWidth = getMeasuredWidth();
if (mViewWidth > 0 ){
mPaint = getPaint();
//Shader.TileMode.MIRROR 镜子,反射,反映
//Shader.TileMode.REPEAT 重复
mLinearGradient = new LinearGradient(0,0,mViewWidth,0,new int[]{Color.RED,Color.GREEN,Color.CYAN,0xffffffff,Color.BLUE},null, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
mGradientMatrix = new Matrix();
}
}
}
}
- new int[]{Color.RED,Color.GREEN,Color.CYAN,0xffffffff,Color.BLUE} 这里面就是颜色的代码,你可以按照自己的喜好来调整int数组里面的颜色。
这里是充分利用Android中Paint对象的Shader渲染器,通过不断变化的LinearGradient,并使用带有该属性的Paint对象来绘制要显示的文字。
- 在onSizeChanged()方法中进行一些对象的初始化,并根据View的宽带来设置一个LinearGradient渐变渲染器
- 使用getPaint()方法获取当前绘制TextView的Paint对象,并给这个Paint对象设置原生TextView没有的LinearGradient属性
- 在onDraw()方法中,通过矩阵的方式来不断平移渐变效果,实现效果