Shader应用---霓虹闪烁文字效果

这里写图片描述

package com.example.apple.shaderdemo;

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.Nullable;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created by apple on 2017/5/10.
 */

public class LinearGradientTextView extends TextView {
    private TextPaint mPaint;

    private LinearGradient mLinearGradient ;
    private Matrix mMatrix;

    private float mTranslate;
    private float DELTAX = 20;
    private int mGradientSize;

    public LinearGradientTextView(Context context) {
        super(context);
    }

    public LinearGradientTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 优先于onDraw执行,在这里得到系统绘制TextView的画笔,然后给这个画笔设置shader
     * 这样下面在执行onDraw的时候,使用的就是带有Shader效果的画笔了
     * @param w
     * @param h
     * @param oldw
     * @param oldh
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        // ★拿到系统TextView的画笔
        mPaint = getPaint();
//        得到文本
        String text = getText().toString();
//        用画笔测量文本的长度
        float textWith = mPaint.measureText(text);
        // 3个文字的宽度
        mGradientSize = (int) (textWith / text.length() * 3);

        // 从左边-gradientSize开始,即左边距离文字gradientSize开始渐变
        // 一个渐变单位是:从第一个字之前3字距离开始到第一个字之前位置终结
        //然后一直让这个渐变单位从左往右移动dx位移,直到最右侧后,向左移动
        // CLAMP意思是:由于你的只是在渐变3个字的长度,那么剩余的空间,让边缘颜色去填充
        mLinearGradient = new LinearGradient(-mGradientSize,0,0,0,new int[]{
                0xffff0000, 0xff00ff00, 0xff00ffff},null, Shader.TileMode.CLAMP
        );

        mPaint.setShader(mLinearGradient);
    }

    @Override
    protected void onDraw(Canvas canvas) {
//        调用super,意思是按照系统绘制textview的流程先把textview绘制完成
        super.onDraw(canvas);

//        我在系统基础上再绘制一些效果


        mTranslate += DELTAX;
        float textWidth = getPaint().measureText(getText().toString());
//        到了边界dx取反
        if(mTranslate > textWidth + mGradientSize || mTranslate < 0){
            DELTAX = - DELTAX;
        }
//       不停地方平移,得到闪烁的效果
        mMatrix = new Matrix();
        mMatrix.setTranslate(mTranslate, 0);
        mLinearGradient.setLocalMatrix(mMatrix);
//        延时重绘
        postInvalidateDelayed(50);

    }
}

你可能感兴趣的:(自定义View)