原文:
http://blog.csdn.net/xu_fu/article/details/24484019
import android.content.Context; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Shader; import android.util.AttributeSet; import android.widget.TextView; public class ShineTextView extends TextView { private LinearGradient mLinearGradient; private Matrix mGradientMatrix; private Paint mPaint; private int mViewWidth = 0; private int mTranslate = 0; private boolean mAnimating = true; 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(); if (mViewWidth > 0) { mPaint = getPaint(); // 創建LinearGradient對象 // 起始點坐標(-mViewWidth, 0) 終點坐標(0,0) // 第一個,第二個參數表示漸變起點 可以設置起點終點在對角等任意位置 // 第三個,第四個參數表示漸變終點 // 第五個參數表示漸變顏色 // 第六個參數可以為空,表示坐標,值為0-1,如果這是空的,顏色均勻分布,沿梯度線。 // 第七個表示平鋪方式 // CLAMP重復最后一個顏色至最后 // MIRROR重復着色的圖像水平或垂直方向已鏡像方式填充會有翻轉效果 // REPEAT重復着色的圖像水平或垂直方向 mLinearGradient = new LinearGradient( -mViewWidth, 0, 0, 0, new int[] { 0xFF0288DA, 0xFFFFFFFF, 0xFF0288DA }, new float[] { 0, 0.5f, 1 }, Shader.TileMode.CLAMP); mPaint.setShader(mLinearGradient); mGradientMatrix = new Matrix(); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mAnimating && mGradientMatrix != null) { mTranslate += mViewWidth / 10; if (mTranslate > 2 * mViewWidth) { mTranslate = -mViewWidth; } mGradientMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(50); } } }