Android中的自绘View的那些事儿(三)之 颜色渐变渲染器:LinearGradient、RadialGradient 和 SweepGradient的简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lyz_zyx/article/details/78648496

我们在上一篇文章《Android中的自绘View的那些事儿(二)之 Shader渲染器和BitmapShader位图渲染器的简介》介绍了渲染器基类Shader以及它五个子类中的BitmapShader位图渲染器的使用,今天我们继续来谈谈LinearGradient线性渲染器、RadialGradient环形渲染器和 SweepGradient梯度渲染器这三个颜色渐变渲染器

LinearGradient线性渲染器

LinearGradient就是创建一个沿着直线绘制线性渐变的渲染器。我们来看看它的构造函数:

    LinearGradient (float x0,                           // 颜色渐变的起点X轴坐标
                    float y0,                           // 颜色渐变的起点Y轴坐标
                    float x1,                           // 颜色渐变的终点X轴坐标
                    float y1,                           // 颜色渐变的终点Y轴坐标
                    int[] colors,                       // 渐变分布的颜色数组,即是渐变从始点到终点的颜色过渡数组,数组长度不限,但决不能为空
                    float[] positions,                  //渐变分布的颜色数组对应的位置,取值范围是[0-1]的浮点值数组,数组长度要和colors保持一致,也可为空,若为空,则表示颜色均匀分布
                    Shader.TileMode tile)               // 渲染平铺模式

示例:

public class MyView extends View {

    public MyView(Context context) {
        this(context, null, 0);
    }
    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        int width = getWidth();
        int height = 500;

        int[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};
        float[] positions = { 0f, 0.5f, 0.8f, 1f };
        LinearGradient linearGradient = new LinearGradient(0, 0, width, 0, colors,positions, Shader.TileMode.CLAMP);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setShader(linearGradient);
        canvas.drawRect(0, 0, width, height, paint);
    }
}

上面代码中,定义了一个LinearGradient,前面4个参数指定颜色渐变的两个坐标,第5个参数是一个颜色数组,这里是红、绿、蓝以及黄,第6个参数是颜色分布的比例

运行效果:

RadialGradient环形渲染器

RadialGradient就是创建一个渲染中心和半径的径向渐变的渲染器。我们来看看它的构造函数:

    RadialGradient (float centerX,                          // 圆心的X坐标
                    float centerY,                          // 圆心的Y坐标
                    float radius,                           // 圆的半径
                    int[] colors,                           // 渐变分布的颜色数组(跟前面介绍LinearGradient的colors一样)
                    float[] stops,                          // 渐变分布的颜色数组对应的位置(跟前面介绍LinearGradient的positions参数一样)
                    Shader.TileMode tileMode)               // 渲染平铺模式

示例:

public class MyView extends View {

    public MyView(Context context) {
        this(context, null, 0);
    }
    public MyView(Context context, AttributeSetattrs) {
        this(context, attrs, 0);
    }
    public MyView(Context context, AttributeSetattrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        int width = getWidth();
        int height = getHeight();
        int radius = 200;

        int[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};
        float[] positions = { 0f, 0.9f, 0.95f, 1f };
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        RadialGradient radialGradientA = new RadialGradient(width / 2, height / 4, radius,colors, positions, Shader.TileMode.CLAMP);
        paint.setShader(radialGradientA);
        canvas.drawCircle(width / 2, height / 4, radius,paint);

        RadialGradient radialGradientB = new RadialGradient(width / 2, height / 4 * 3 + 50, radius, colors, positions,Shader.TileMode.CLAMP);
        paint.setShader(radialGradientB);
        canvas.drawCircle(width / 2, height / 4 * 3, radius, paint);
    }
}

上面代码中,定义了两个RadialGradient,其中RadialGradientA指定的圆心坐标和半径都跟绘出的圆保持一致,而RadialGradientB则在半径上加了50像素

运行效果:

SweepGradient梯度渲染器

SweepGradient就是在中心点绘制扫描梯度的渲染器。我们来看看它的构造函数:

扫描二维码关注公众号,回复: 3435997 查看本文章

    SweepGradient (float cx,                                // 圆心的X坐标
                   float cy,                                // 圆心的Y坐标
                   int[] colors,                            // 渐变分布的颜色数组(跟前面介绍LinearGradient的colors一样)
                   float[] positions)                       // 渐变分布的颜色数组对应的位置(跟前面介绍LinearGradient的positions参数一样)

示例

public class MyView extends View {

    public MyView(Context context) {
        this(context, null, 0);
    }
    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

        int width = getWidth();
        int height = getHeight();
        int radius = 200;

        int[] colors = { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW};
        float[] positions = { 0f, 0.9f, 0.95f, 1f };
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        SweepGradient sweepGradient = new SweepGradient(width / 2, height / 2, colors, positions);
        paint.setShader(sweepGradient);
        canvas.drawCircle(width / 2, height / 2, radius, paint);
    }
}

上面代码中,定义了一个SweepGradient,参数都很简单,分别是跟绘制保持一至的圆心还有颜色数组和颜色分布数组

运行效果:


猜你喜欢

转载自blog.csdn.net/lyz_zyx/article/details/78648496
今日推荐