Shader渲染或者是着色器

shader的公用方法介绍
  • Shader.TileMode:几种渲染平铺模式
  • CLAMP :复制左边缘和下边缘的颜色来绘制剩余的部分
  • MIRROR:镜像的方式重复图片的绘制(和我们照镜子一样的效果)
  • REPEAT:重复图片绘制(windows设置背景时的平铺)
这里介绍下shader是什么?三种模式是什么?如何使用的?
  • shader就是一个渲染时的着色器,他的使用是绘制时,设置在画笔上的paint.setShader(bitmapShader); 然后使用画笔画图形时,就会使用相应的shader来绘制(填充)图形。
  • 绘制的图形就像一个容器,然后不同的shader就在这个容器上填充东西。
    还是BitmapShader举例,如在一张墙上(绘制的图形),需要贴满瓷砖(一个瓷砖就是一个位图),然后瓷砖会按照上面的三种TileMode模式来贴满整个瓷砖
  • 下面的其他几个shader子类同理,如LinearGradient就是在这个墙上使用颜色填充满
shader6个子类介绍
  • BitmapShader渲染图像,位图渲染就是使用一个位图来进行渲染(填充)
    BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
    bitmap:位图填充 、tileX/tileY:x轴y轴填充的模式
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
Paint paint=new Paint();
paint.setColor(Color.GRAY);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.a);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.MIRROR);
paint.setShader(bitmapShader);
canvas.drawRect(new Rect(0,0,bitmap.getWidth()*3, bitmap.getHeight()*3),paint);  }

效果图如下:
这里写图片描述

  • LinearGradient线性渲染,线性渲染就是通过一组颜色值,来填充
LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

x0、y0渐变的起点,x1、y1渐变的结束坐标,colors渐变填充的颜色数组,tile模式
positions:参数表示颜色数组中值的位置,如果为null则线性填充
一般不设置这个参数,现在不明白这个参数的算法!

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

同上,只是这里把colors数组换成了2个color0、color1参数,少了positions参数

 @Override
    public void draw(Canvas canvas) { 
        Paint paint=new Paint();
        paint.setColor(Color.GRAY);
        int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
        LinearGradient lg=new LinearGradient(0,0,300,300,colors,null,Shader.TileMode.MIRROR);
        paint.setShader(lg);
        canvas.drawRect(new Rect(0,0,300, 300),paint);}

效果图:
这里写图片描述

  • RadialGradient环形渲染
# 环形渲染效果简单点就是蚊香,一圈一圈,只是蚊香只有一种颜色,而环形渲染有2种或者多种颜色交替渲染,就是圆圈由多种颜色组成
#RadialGradient(float centerX, float centerY, float radius, int[] colors, float[] stops, Shader.TileMode tileMode)

centerX,centerY:这两个决定渲染时绘制时开始的坐标点
radius:代表渲染的圆的圆弧宽度,越小越细(渲染出的圆的圈数就越多)
2个颜色数组代表渲染时圆的颜色
stops:如果为null表示颜色属组均匀分布,这个值和线性渲染的位置参数类似,但是算法不明白

#RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, Shader.TileMode tileMode)

同上,只是渲染时颜色变成了2个

//第一个构造函数demo
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
RadialGradient rg=new RadialGradient(150,150,10,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);
RadialGradient rg1=new RadialGradient(150,150,10,colors,null,Shader.TileMode.MIRROR);
paint.setShader(rg1);
canvas.drawRect(new Rect(0,0,300, 300),paint);}
-----------------------分割线-----------------------------------------
//第二个构造函数demo
@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
RadialGradient rg=new RadialGradient(150,150,10,Color.RED,Color.BLUE,Shader.TileMode.MIRROR);
paint.setShader(rg);
canvas.drawRect(new Rect(0,0,300, 300),paint);}

这里写图片描述

  • SweepGradient 梯度渲染(类似雷达扫描)。
SweepGradient(float cx, float cy, int[] colors, float[] positions)
SweepGradient(float cx, float cy, int color0, int color1)

cx、cy确定渲染开始的中心坐标
color表示可以是个颜色数组,color0、color1也可以是单个颜色
positions:null表示均匀渲染,这个参数对应到颜色数组,表示每个颜色渲染的相对位置算法暂不知道

@Override
public void draw(Canvas canvas) {
Paint paint=new Paint();
paint.setColor(Color.GRAY);
int colors[]={Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
SweepGradient sg=new SweepGradient(300,300,colors,null);
paint.setShader(sg);
canvas.drawCircle(300,300,150,paint);}

这里写图片描述

  • ComposeShader 组合渲染(组合其他几个子类使用)
ComposeShader(Shader shaderA, Shader shaderB, Xfermode mode)
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)

组合多个shader,其中第二个构造函数的PorterDuff是第一个Xfermode的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值