使用線性渲染(LinearGradient)可以實現(xiàn)文字輪播效果缓淹。
其思路是:
(1)獲取文字的寬度静尼;
(2)計劃每三個字為線性渲染的長度(文字寬度 / 字?jǐn)?shù) * 3);
(3)重繪時使用矩陣變換的平移操作掩缓;
mMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mMatrix);
(4)實現(xiàn)輪播
postInvalidateDelayed(100);
代碼如下:
public class GradientTextView extends android.support.v7.widget.AppCompatTextView {
private LinearGradient mLinearGradient;
private TextPaint mPaint;
private Matrix mMatrix;
//移動總量
private float mTranslate;
//每次重繪的偏移量
private float offset = 20;
//文字寬度
private float textWith;
//線性渲染線段長度
private int gradientSize;
public GradientTextView(Context context) {
this(context, null);
}
public GradientTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public GradientTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = getPaint();
mMatrix = new Matrix();
String text = getText().toString();
//獲取文字的寬度
textWith = mPaint.measureText(text,0,text.length());
//設(shè)置漸變的寬度雪情,就按照3個字作為一個漸變長度
gradientSize = (int) (textWith / text.length() * 3);
mLinearGradient = new LinearGradient(0, 0, gradientSize, 0, new int[]{Color.parseColor("#22ffffff"), Color.parseColor("#ffffffff"), Color.parseColor("#22ffffff")}, null, Shader.TileMode.CLAMP);
mPaint.setShader(mLinearGradient);
}
@Override
protected void onDraw(Canvas canvas) {
//將背景設(shè)置成黑色
canvas.drawColor(Color.BLACK);
//這里有繪制文字的邏輯
super.onDraw(canvas);
mTranslate += offset;
if (mTranslate >= textWith) {
mTranslate -= offset;
offset = -offset;
}
if(mTranslate <= 0){
offset = -offset;
mTranslate += offset;
}
//移動漸變
mMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mMatrix);
//每次重繪延遲時間是100毫秒
postInvalidateDelayed(100);
}
}
效果如下:
2.gif
[本章完...]