閑來無事,收到街邊廣告LED的啟發,想着自己實現一個類似的彩色字體閃爍的效果。
設計思路
我們知道android的LinearGradient可以實現顏色漸變的背景,那么如果只有速度夠快,通過在水平方向上不斷的平移LinearGradient就可以渲染出文字閃爍的效果了。代碼如下:
package com.example.customview.view; 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.util.Log; import android.view.View.MeasureSpec; import android.view.WindowManager; import android.widget.TextView; public class CustomTextView extends TextView { private final static String TAG = CirclePercentView.class.getSimpleName(); private Paint paint1; private Paint paint2; private int mWidth; private LinearGradient gradient; private Matrix matrix; //漸變的速度 private int deltaX; public CustomTextView(Context context) { super(context, null); } public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); initView(context, attrs); // TODO Auto-generated constructor stub } private void initView(Context context, AttributeSet attrs) { paint1 = new Paint(); paint1.setColor(getResources().getColor(android.R.color.holo_blue_dark)); paint1.setStyle(Paint.Style.FILL); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { // TODO Auto-generated method stub super.onSizeChanged(w, h, oldw, oldh); if(mWidth == 0){ Log.e(TAG,"*********************"); mWidth = getMeasuredWidth(); paint2 = getPaint(); //顏色漸變器 gradient = new LinearGradient(0, 0, mWidth, 0, new int[]{Color.BLUE,Color.GREEN,Color.RED}, null, Shader.TileMode.CLAMP); paint2.setShader(gradient); matrix = new Matrix(); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(matrix !=null){ deltaX+=mWidth/5; if(deltaX>2*mWidth){ deltaX = -mWidth; } } //關鍵代碼通過矩陣的平移實現 matrix.setTranslate(deltaX, 0); gradient.setLocalMatrix(matrix); postInvalidateDelayed(10); } }
運行效果如下:

