Shader
Shader直译是着色器,或者也叫颜色渲染器。Android中对应有Shader类,它是一个基类对象,它在图形绘制过程中返回一段颜色值,通过调用Paint.setShader(Shader shader);方法,可以将它的子类装载进Paint中,这样Paint对象在绘制过程中所获取的颜色就是来自Shader对象。
模式
Shader中定义了三种平铺模式,其值在emunShader.TileMode枚举中,分别是:
Shader.TileMode CLAMP // 边缘拉伸
Shader.TileMode MIRROR // 以镜像的方式在X和Y方向复制
Shader.TileMode REPEAT // X和Y方向复制
方法
Shader中有两个重要的方法:
boolean getLoaclMatrix(Matrix localM); // 返回是否存在非本地的矩阵localM
void setLocalMatrix(Matrix localM); // 为Shader设置一个本地矩阵
子类
Shader有5个子类:
BitmapShader 位图渲染器
LinearGradient 线性渲染器
RadialGradient 环形渲染器
SweepGradient 梯度渲染器
ComposeShader 组合渲染器
BitmapShader位图渲染器
BitmapShader是将位图绘制为纹理的渲染器。我们来看看它的构造函数:
BitmapShader(Bitmap bitmap, // 使用的位图对象
Shader.TileMode tileX, // 位图上X坐标方向的渲染平铺模式
Shader.TileMode tileY) //位图上Y坐标方向的渲染平铺模式
示例:
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);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(shader);
canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2,paint);
}
}
上面代码中,定义了一个BitmapShader,并指定它的模式是X坐标方向以镜像的方式复制,而Y坐标方向是边缘伸拉。最后在比位图大2倍的矩形中绘制出来
运行效果:
修改onDraw中的代码,使用setLocalMatrix旋转位图:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap bitmap =BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
Matrix matrix = new Matrix();
matrix.setRotate(-90, bitmap.getWidth() / 2, bitmap.getHeight() / 2); // 旋转-90度
shader.setLocalMatrix(matrix);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(shader);
canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2,paint);
}
上面代码中,在原来基础上加入了三行代码。其中主要是定义了一个本地矩阵Matrix,并在参数中指定将其旋转-90度
运行效果:
再次修改onDraw中的代码,本次我们不绘制矩形,改成绘制文字:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.icon);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.MIRROR,Shader.TileMode.CLAMP);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(100);
paint.setShader(shader);
canvas.drawText("Hello World", 0, bitmap.getHeight() / 2,paint);
}
上面代码中,将原来绘制在一个矩形区域替换成绘制在文字"Hello World"中