日结 Day31

日结| Day31

一件事,即使你放弃了,依旧会有人在坚持。

早起

6点50准时起床,阅读《摆渡人》

运动

俯卧撑:3组20个,哑铃:3组10个,深蹲:3组10个

阅读

阅读《摆渡人》

学习

《自定义控件》第七章 Shader 之 LinearGradient

实现线性渐变效果

示例:闪光文字效果

日结 Day31_第1张图片
示例图

原理:

  1. 创建的 LinearGradient 初始位置在文字左侧,而且大小与文字所占位置相同,填充模式使用边缘填充
  2. 从起始位置和终止位置可以看出,LinearGradient 渐变的运动长度是两个文字的长度。
    代码如下所示:
public class ShimmerTextView extends android.support.v7.widget.AppCompatTextView {

    private final TextPaint mPaint;
    private float mDx;
    private LinearGradient mLinearGradient;

    public ShimmerTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        mPaint = getPaint();
        // 测量指定文字的长度
        int length = (int) mPaint.measureText(getText().toString());
        createAnim(length);
        createLinearGradient(length);
    }

    private void createAnim(int length) {
        ValueAnimator animator = ValueAnimator.ofFloat(0, 2 * length);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mDx = (float) animation.getAnimatedValue();
                postInvalidate();
            }
        });
        animator.setRepeatMode(ValueAnimator.RESTART);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setDuration(2000);
        animator.start();
    }

    private void createLinearGradient(int length) {
        mLinearGradient = new LinearGradient(-length, 0, 0, 0, new int[]{
                getCurrentTextColor(), 0xff00ff00, getCurrentTextColor()
        }, new float[]{
                0, 0.5f, 1
        }, Shader.TileMode.CLAMP);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        Matrix matrix = new Matrix();
        matrix.setTranslate(mDx, 0);
        mLinearGradient.setLocalMatrix(matrix);
        mPaint.setShader(mLinearGradient);
        super.onDraw(canvas);
    }
}

你可能感兴趣的:(日结 Day31)