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的子类