1. 程式人生 > >Android群英傳--對現有控制元件進行拓展(動態的文字閃動效果)

Android群英傳--對現有控制元件進行拓展(動態的文字閃動效果)

利用linearGradient Shader和Matrix來實現一個動態的文字閃動效果。

要想實現這一個效果,可以充分利用Android 中Paint物件的Shader渲染器。通過一個不斷變化的linearGradient,並使用帶有該屬性的Paint物件來繪製要顯示的文字。首先需要在OnSizeChanged()方法中進行一些物件的初始化工作,並根據View的寬來設定一個LinearGradient漸變渲染器,程式碼如下:

@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(); //設定線性漸變 mLinearGradient = new LinearGradient( // 起始點的x座標 -mViewWidth, //起始點的y座標 0, //終點的x座標 0, //終點的y座標 0, //顏色漸變 new int
[]{0xFFDE8E8E, 0xFFD14E4E, 0xFFD61313}, //漸變的位置 new float[]{0, 0.5f, 1}, //平鋪方式 Shader.TileMode.CLAMP); mPaint.setShader(mLinearGradient); mGradienMatrix = new Matrix(); } } }
其中最關鍵的就是使用getPaint()方法獲取當前繪製TextView的Paint物件,並給這個Paint物件設定原生TextView沒有的LinearGradient屬性,最後在onDraw()方法中,通過矩陣的方式來不斷平移漸變效果,從而在繪製文字時,產生動態的閃動效果,程式碼如下:
@Override
protected void onDraw(Canvas canvas) { super.onDraw(canvas); //判斷是否例項化矩形 if (mGradienMatrix != null) { //漸變距離每次增加總寬的十分之一 mTranslate += mViewWidth / 10; //超過兩個畫布長度就重新回到畫布以外,防止出現閃屏的效果 if (mTranslate > 2 * mViewWidth) { mTranslate = -mViewWidth; } //給矩陣設定過渡效果和初始點 mGradienMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradienMatrix); //延遲繪製 postInvalidateDelayed(150); } }
以下是完整的程式碼:
public class MyTextView extends TextView {

    private LinearGradient mLinearGradient;
    private Paint mPaint;
    private int mViewWidth = 0;
    private int mTranslate = 0;
    private Matrix mGradienMatrix;
    public MyTextView(Context context) {
        super(context);
}

    public MyTextView(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();
//設定線性漸變
mLinearGradient = new LinearGradient(
                        // 起始點的x座標
-mViewWidth,
//起始點的y座標
0,
//終點的x座標
0,
//終點的y座標
0,
//顏色漸變
new int[]{0xFFDE8E8E, 0xFFD14E4E, 0xFFD61313},
//漸變的位置
new float[]{0, 0.5f, 1},
//平鋪方式
Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
mGradienMatrix = new Matrix();
}
        }
    }

    @Override
protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
//判斷是否例項化矩形
if (mGradienMatrix != null) {
            //漸變距離每次增加總寬的十分之一
mTranslate += mViewWidth / 10;
//超過兩個畫布長度就重新回到畫布以外,防止出現閃屏的效果
if (mTranslate > 2 * mViewWidth) {
                mTranslate = -mViewWidth;
}
            //給矩陣設定過渡效果和初始點
mGradienMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradienMatrix);
//延遲繪製
postInvalidateDelayed(150);
}
    }
}