差不多这个效果:
全部代码:
package com.example.jadynai.loadinglovely.flicker; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.LinearGradient; import android.graphics.Matrix; import android.graphics.Shader; import android.support.annotation.IntRange; import android.support.v7.widget.AppCompatTextView; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.LinearInterpolator; /** * @version: * @FileDescription: * @Author:冯人唐 * @Since:2018/5/2 * @ChangeList: */ public class TextFlickerView extends AppCompatTextView { private static final String TAG = "TextFlickerView"; //闪光的宽度 public static final int SHADOW_W = 50; private Matrix mShadowMatrix; private LinearGradient mLinearGradient; private ValueAnimator mValueAnimator; private int mRepeatCount = 50; public TextFlickerView(Context context) { super(context); } public TextFlickerView(Context context, AttributeSet attrs) { super(context, attrs); } public TextFlickerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); tryInitEngine(w); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Log.d(TAG, "onDraw: " + System.currentTimeMillis()); if (mLinearGradient != null) { mLinearGradient.setLocalMatrix(mShadowMatrix); } } private void tryInitEngine(int w) { if (mShadowMatrix == null) { if (w > 0) { //控制阴影的Matrix,通过Matrix的变化来实现闪光的滑过效果 mShadowMatrix = new Matrix(); //因为使用了LinearGradient,所以Paint本身的color将毫无意义,所以colors的起始点的色值必须和本来色值一致 int currentTextColor = getCurrentTextColor(); //渐变色层.x0,y0是起点坐标,x1,y1是终点坐标 mLinearGradient = new LinearGradient(0, 0, SHADOW_W, 0, new int[] {currentTextColor, Color.GREEN, Color.BLUE}, null, Shader.TileMode.CLAMP); //画笔设置Shader getPaint().setShader(mLinearGradient); //使用属性动画作为引擎,数值从-SHADOW变化到TextView本身的宽度。间隔时间未1500ms mValueAnimator = ValueAnimator.ofFloat(-SHADOW_W, w).setDuration(1500); mValueAnimator.setInterpolator(new LinearInterpolator()); mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float value = (float) animation.getAnimatedValue(); //Matrix移动来实现闪光滑动 mShadowMatrix.setTranslate(value, 0); invalidate(); } }); mValueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationRepeat(Animator animation) { super.onAnimationRepeat(animation); //每次动画重复时,将Matrix重置 mShadowMatrix.reset(); } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mShadowMatrix.reset(); } }); mValueAnimator.setRepeatCount(mRepeatCount); } } } public void setDuration(@IntRange(from = 1, to = 15) int second) { mRepeatCount = second - 1; if (mValueAnimator != null) { mValueAnimator.setRepeatCount(mRepeatCount); } } public void start() { if (mValueAnimator == null) { postDelayed(new Runnable() { @Override public void run() { tryInitEngine(getWidth()); if (mValueAnimator != null) { mValueAnimator.start(); } } }, 100); } } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); } @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); release(); } private void release() { if (mValueAnimator != null) { mValueAnimator.removeAllListeners(); mValueAnimator.cancel(); mValueAnimator = null; } mShadowMatrix = null; mLinearGradient = null; } }这是原项目地址