Shader
通过Paint.setShader(Shader shader)来设置我们要显示图形的颜色.
通常我们并不直接使用Shader,而是使用它的子类来实现我们所需要实现的功能
它的子类:BitmapShader
LinearGradient
SweepGradient
RadialGradient
ComposeShader
TileMode
着色器平铺模式,一共有三种
- TileMode.CLAMP : 拉伸
- TileMode.REPEAT : 重复
- TileMode.MIRROR : 镜像
BitmapShader(位图着色器)
- 第一种情况:画图时边界小于等于位图的边界
String text = "Shader";
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.headimg);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);//(1)
// BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);//(2)
// BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);//(3)
Paint paint = new Paint();
paint.setShader(bitmapShader);
// canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
canvas.drawBitmap(bitmap,0,0,paint);
代码效果图:当Rect的边界为图片的边界时,无论使用哪种平铺方式页面显示的效果相同,都是讲bitmap完整显示在屏幕上,所以我们可以得出,如果Rect的边界小于图片的边界时,屏幕上就只显示图片的一部分(按照Rect的边界显示
)
同时我们还可以使用canvas画多种形状的图形,这时可以把bitmap当成画布的背景:圆形头像,五角星图形,多边形,带弧度的矩形等
* 第二种情况,画图时Rect的边界超出位图的边界
String text = "Shader";
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.headimg);
BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);//(1)
// BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);//(2)
// BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);//(3)
Paint paint = new Paint();
paint.setShader(bitmapShader);
// canvas.drawRect(0, 0, n*bitmap.getWidth(), n*bitmap.getHeight(), paint);
(1)在x,y方向 使用边缘拉伸模式会在图片在对应的x,y方向上将边缘的一个像素进行拉伸、扩展.(注意先在y方向上拉升,在