Android群英傳--對現有控制元件進行拓展(動態的文字閃動效果)
阿新 • • 發佈:2019-02-17
利用linearGradient Shader和Matrix來實現一個動態的文字閃動效果。
要想實現這一個效果,可以充分利用Android 中Paint物件的Shader渲染器。通過一個不斷變化的linearGradient,並使用帶有該屬性的Paint物件來繪製要顯示的文字。首先需要在OnSizeChanged()方法中進行一些物件的初始化工作,並根據View的寬來設定一個LinearGradient漸變渲染器,程式碼如下:
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super其中最關鍵的就是使用getPaint()方法獲取當前繪製TextView的Paint物件,並給這個Paint物件設定原生TextView沒有的LinearGradient屬性,最後在onDraw()方法中,通過矩陣的方式來不斷平移漸變效果,從而在繪製文字時,產生動態的閃動效果,程式碼如下:.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); } }
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); } } }