自定义颜色渐变的TextView

有时候我们会看到有些文字上面有其他颜色一闪而过,最常看见的情景就是手机在开机的时候logo的渐变。

这里先贴上一张静态图,实际上运行效果是动态的:自定义颜色渐变的TextView_第1张图片

先贴代码:

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.widget.TextView;

public class GradientTextView extends TextView{
    private int width;
    /** 移动距离*/
    private int translateWidth;
    private Paint paint;
    private Matrix matrix;
    private LinearGradient linearGradient;

    public GradientTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public GradientTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public GradientTextView(Context context) {
        super(context);
    }
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        if(w!=0){
            width=w;
        }else{
            width=getMeasuredWidth();
        }
        paint=getPaint();
        linearGradient=new LinearGradient(-width, 0,0,0, 
                new int[]{Color.RED,Color.GREEN,Color.MAGENTA},
                new float[]{0,0.5f,1f},
                Shader.TileMode.CLAMP);
        //添加渲染
        paint.setShader(linearGradient);
        paint.setColor(Color.BLACK);
        matrix=new Matrix();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(matrix==null)
            return;
        //每次移动原来宽的15分之一
        translateWidth+=width/15;
        //表示刚刚移动 了width个宽度 即 正好包含了整个textview 的时候还原
        if(translateWidth>width*2){
            translateWidth-=width*2;
        }
        //移动
        matrix.setTranslate(translateWidth,0);
        linearGradient.setLocalMatrix(matrix);
        postInvalidateDelayed(100);
    }
}

代码里面用到的其实就是Shader颜色渲染;

Shader有几个直接子类:

BitmapShader : 主要用来渲染图像

LinearGradient :用来进行线性渲染

RadialGradient : 用来进行环形渲染

SweepGradient : 扫描渐变—围绕一个中心点扫描渐变就像电影里那种雷达扫描,用来梯度渲染。

ComposeShader : 组合渲染,可以和其他几个子类组合起来使用;

这里用到的是LinearGradient线性渲染,LinearGradient有两个初始方法:

public LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

X0: 渐变起初点坐标x位置

y0: 渐变起初点坐标y位置

x1: 渐变终点坐标x位置

y1: 渐变终点坐标y位置

colors: 渐变颜色数组

positions:这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布

tile:平铺方式


public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile)

X0: 渐变起初点坐标x位置

y0: 渐变起初点坐标y位置

x1: 渐变终点坐标x位置

y1: 渐变终点坐标y位置

color0: 渐变开始颜色

color1: 渐变结束颜色

tile: 平铺方式


TileMode:(一共有三种)

CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色(拉伸的是图片最后的那一个像素,并不断重复)。

REPEAT :横向和纵向的重复渲染器图片,平铺(横向 纵向不断重复)。

MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT重复方式不一样,他是以镜像方式平铺(横向纵向不断翻转重复)

大牛关于shader的详解:http://blog.csdn.net/t12x3456/article/details/10418901

最后是关于getMeasuredWidth();

getWidth() 与getMeasuredWidth()的区别:

getWidth(): View在设定好布局后整个View的宽度(即 onlayout方法后会对getWidth赋值);

getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度(即调用了onmeasure方法之后才会对getMeasuredWidth赋值)

最后得到的结果是相等的,getHeight()与getMeasureHeight()是类似的。

你可能感兴趣的:(自定义,LinearGrad,canvas,textview)