Shader之LinearGradient

LinearGradient这个着色器主要作用是画渐变,它有两个构造方法

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

x0,y0 表示渐变的起点坐标

x1,y1便是渐变的终点坐标

color0起点颜色

color1终点颜色

Shader.TileMode tile 是渐变填充视图的方式

先看看例子,用宽度200,高度200的红色到黄色的渐变色块去填充布满整个屏幕的视图。代码如下

public class LinearGradientView extends View {

    private Paint mPaint;
    private Rect rect;
    private LinearGradient linearGradient;
    private int screenWidth,screenHeight;

    public LinearGradientView(Context context) {
        this(context,null);
    }

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

        mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);

        screenWidth=ScreenUitl.getScreenWidth(context);
        screenHeight=ScreenUitl.getScreenHeight(context);

        linearGradient=new LinearGradient(0,0,200,200,Color.RED,
                Color.YELLOW,Shader.TileMode.CLAMP);
        mPaint.setShader(linearGradient);

        rect=new Rect(0,0,screenWidth,screenHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas);

        canvas.drawRect(rect,mPaint);
    }
}

CLAMP模式  绘制一个200*200的渐变块后,以最后一个像素的黄色做拉伸

MIRROR模式  绘制一个200*200的渐变色块后,翻滚绘制

REPEAT模式  绘制一个200*200的渐变色块后, 重复绘制

 

如果把绘制的矩形水平垂直移动300,

起点位置竟然不是红色了。其实把,它的原理和BitmapShader一样。实际绘图是从视图的原点开始,上图的视图原点是在(0,0),也就是说是从(0.0)坐标开始绘制的。但是具体显示区域有多大是由在onDraw绘制的rect的位置和大小决定的。所以上图是显示了rect(300,300,screenWidth,screenHeight)这个范围的内容。

 

LinearGradient还有一个构造方法,可以设置多个渐变颜色值

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

x0,y0 表示渐变的起点坐标

x1,y1便是渐变的终点坐标

colors 渐变的颜色值,这里可以设置大于两个颜色值

positions 每个颜色值占渐变色值块的百分比位置如colors为new int[] { Color.RED, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE },positions为new float[] { 0, 0.1F, 0.5F, 0.7F, 0.8F }则颜色渐变占比为RED 到 YELLOW 从0%到10% YELLOW到GREEN 10%到50% GREEN到CYAN 50%到70%  CYAN到BLUE 80%到100%

如下例子

public class LinearGradientView extends View {

    private Paint mPaint;
    private Rect rect;
    private LinearGradient linearGradient;
    private int screenWidth,screenHeight;

    public LinearGradientView(Context context) {
        this(context,null);
    }

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

        mPaint=new Paint(Paint.ANTI_ALIAS_FLAG);

        screenWidth=ScreenUitl.getScreenWidth(context);
        screenHeight=ScreenUitl.getScreenHeight(context);

        linearGradient=new LinearGradient(0,0,200,200,
                new int[]{Color.RED, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE },
                new float[]{0, 0.1F, 0.5F, 0.7F, 0.8F},Shader.TileMode.CLAMP);
        mPaint.setShader(linearGradient);

        rect=new Rect(0,0,screenWidth,screenHeight);
    }

    @Override
    protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas);

        canvas.drawRect(rect,mPaint);
    }

CLAMP模式

MIRROR模式

REPEAT模式

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值