shader 渲染器,有如下四中渲染器
* BitmapShader 位图渲染器
* ComposeShader 组合渲染器
* LinearGradient 线性渲染器
* RadialGradient 环形渲染器
* SweepGradient 梯度渲染器
官方文档介绍如下
Shader is the based class for objects that return horizontal spans of colors during drawing. A subclass of Shader is installed in a Paint calling paint.setShader(shader). After that any object (other than a bitmap) that is drawn with that paint will get its color(s) from the shader.
这段话有几个重点:
1,怎么使用,shader是给paint使用的,paint.setShaer(shader);
2.shader不仅仅是渲染bitmap,还能渲染其他的,比如文字
备注:个人感觉只要paint能画的都能渲染
3.返回水平空白方向的渲染颜色
接下来介绍bitmapshader,shader有三种渲染方式
这个是原图
bitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.shader)).getBitmap();
int height = bitmap.getHeight();
int width = bitmap.getWidth();
offset = (int) (Math.min(width, height) * 1.7f);
/**
* bitmap 要渲染的图片
* @param tileX x轴的渲染模式
* @param tileY y轴的渲染模式
* 总共有三种渲染模式,xy方向可以混合使用
* Shader.TileMode.CLAMP 最外面的色素平铺填充空白
* Shader.TileMode.MIRROR bitmap为单位镜像填充空白
* Shader.TileMode.REPEAT bitmap为单位复制填充空白
*/
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
paint.setShader(shader);
canvas.drawRect(new Rect(centerX - offset, centerY -offset,centerX+offset,centerY+offset),paint);
左上角是原图,其他空白区域的效果是渲染出来的
第一种CLAMP 方式的效果:
第二种MIRROR 的效果
第三种 REPEAT 效果如下:
是不是看起来和windows桌面壁纸设置的效果一样的。
用处也很常见的,比如圆形头像,截取外接圆的留下的空白就用bitmapShader去平铺渲染.
接着是线性渲染器LinearGradient 的实例效果,最经典的是windows画板自带的调色板
/**
* 线性渲染器的使用
@param x0 起点
@param y0
@param x1 终点
@param y1
@param colors 线性渐变的颜色
@param positions 可以为空,每个颜色占据矩形色块的宽度或者长度,为空是均分
@param tile 渲染模式三种,平铺、拉伸、镜像
*/
int[] color=new int[]{Color.BLUE,Color.BLACK,Color.YELLOW,Color.GREEN,Color.DKGRAY};
LinearGradient linearGradient=new LinearGradient(0,0,450,450,color,null, Shader.TileMode.CLAMP);
paint.setShader(linearGradient);
paint.setAntiAlias(true);
canvas.drawRect(0,0,450,450,paint);
下面是圆形渲染器的使用
/**
* /** Create a shader that draws a radial gradient given the center and radius.
@param centerX 中心点
@param centerY 中心点
@param radius 半径,必须是正数
@param colors 圆形色轮的颜色
@param stops 和线性的一样
@param tileMode The Shader tiling mode
*/
int [] color1=new int[]{Color.RED,Color.BLUE};
RadialGradient radialGradient=new RadialGradient(450,450, 400,color1,null, Shader.TileMode.CLAMP);
Paint paint1=new Paint();
paint1.setAntiAlias(true);
paint1.setShader(radialGradient);
canvas.drawRect(0,0,450,450,paint1);
怎么感觉看起来像是日晕呢?
改变颜色种类之后效果如下:
这里面有一个渐变融合过渡的效果,颜色少看起来是很帅的。
线性的渲染器很多app都用到了,比如酷狗的歌词,比如今日头条的字体渲染显示刷新效果。
那上面到底有么有坑呢?肯定是有的,渲染器至少要求2种颜色以上。
后面的几种渲染器用法差不多,大同小异。