android羣英傳筆記——對現有控件進行拓展(閃動的文字效果)

這是我第一次寫博客同時也是剛接觸android開發,如果有什麼不對的地方請多多包含。

閃動的文字效果

此處利用LinearGradient Shader和Matrix來實現動態的文字閃動效果,效果如圖所示:

效果圖

想要實現這一效果,可以充分利用android中Paint對象的Shader渲染器。

設置一個不斷變化的LinearGradient,使用帶有屬性的Paint對象來繪製要顯示的文字。首先,在
onSizeChanged()方法中進行對象的初始化,代碼如下所示:

@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位置
                        0,
                        // 起始點的y位置
                        0,
                        // 終點的x位置
                        mViewWidth,
                        // 終點的y位置
                        0,
                        // 漸變顏色
                        new int[]{
                                Color.BLUE, 0xffffffff,
                                Color.BLUE
                        },
                        null,
                        // 平鋪方式
                        Shader.TileMode.CLAMP
                );
                // 爲畫筆設置着色器
                mPaint.setShader(mLinearGradient);
                // 設置傾斜矩形
                mGradientMatrix = new Matrix();
            }
        }
    }

最後,在onDraw()方法中,通過矩陣的方式來不斷平移漸變效果,從而在繪製文字時,產生動態的閃動效果,代碼如下所示:

 @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        // 判斷是否實例化矩形(執行順序理論上是先執行onSizeChanged()方法後再執行此方法)
        if(mGradientMatrix != null){
            // 距離每次增加總寬的五分之一
            mTranslate += mViewWidth/5;
            // 超過兩個畫布長度就重新回到畫布以外,防止出現閃屏的效果
            if(mTranslate > 2*mViewWidth){
                mTranslate = -mViewWidth;
            }
            // 給矩陣設置過度效果和初始點
            mGradientMatrix.setTranslate(mTranslate, 0);
            mLinearGradient.setLocalMatrix(mGradientMatrix);
            // 延遲重繪(設置爲100ms)
            postInvalidateDelayed(100);
        }
    }

以上就是閃動文字的實現方法,其實可以通過res資源目錄的values目錄下創建一個attrs.xml的屬性定義文件來自定義屬性,比如設置閃動的速度或是閃動的矩形大小。

代碼

以下是完整代碼:

package com.example.customConcrols;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Shader;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * 重寫TextView控件,閃動的文字效果
 * Created by shize on 2016/8/29.
 */
public class CustomTextView extends TextView {
    private int mViewWidth = 0;
    // 水平方向上平移的距離
    private int mTranslate = 0;
    private LinearGradient mLinearGradient;
    private Matrix mGradientMatrix;
    private Paint mPaint;

    public CustomTextView(Context context) {
        super(context);
    }
    // 此處必須使用構造方法二(沒有程序會報錯)
    public CustomTextView(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(
                        0,
                        0,
                        mViewWidth,
                        0,
                        new int[]{
                                Color.BLUE, 0xffffffff,
                                Color.BLUE
                        },
                        null,
                        // 平鋪方式
                        Shader.TileMode.CLAMP
                );
                mPaint.setShader(mLinearGradient);
                mGradientMatrix = new Matrix();
            }
        }
    }

    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        if(mGradientMatrix != null){
            mTranslate += mViewWidth/5;
            if(mTranslate > 2*mViewWidth){
                mTranslate = -mViewWidth;
            }
            mGradientMatrix.setTranslate(mTranslate, 0);
            mLinearGradient.setLocalMatrix(mGradientMatrix);
            // 延遲重繪
            postInvalidateDelayed(100);
        }
    }

}

感謝閱讀,學習重在堅持,貴在堅持,下次再見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章