转载请注明出处:http://blog.csdn.net/crazy1235/article/details/74011243
Shader – 着色器!
Shader 共有5个子类!
public Shader setShader(Shader shader) {
// If mShader changes, cached value of native shader aren't valid, since
// old shader's pointer may be reused by another shader allocation later
if (mShader != shader) {
mNativeShader = -1;
}
// Defer setting the shader natively until getNativeInstance() is called
mShader = shader;
return shader;
}
下面分别来说一下这五种着色器!
BitmapShader
图片着色器
来看下BitmapShader的构造函数:
public BitmapShader(@NonNull Bitmap bitmap, TileMode tileX, TileMode tileY) {
mBitmap = bitmap;
mTileX = tileX;
mTileY = tileY;
init(nativeCreate(bitmap, tileX.nativeInt, tileY.nativeInt));
}
第一个参数就是要处理的图片!
第二个和第三个参数表示贴图模式 – TileMode, 是一个枚举类型。
public enum TileMode {
/**
* 当图形尺寸大于bitmap尺寸时,用bitmap的边缘颜色进行填充剩余空间
*/
CLAMP (0),
/**
* 当要绘制的图形尺寸大于Bitmap尺寸时,会用Bitmap重复平铺整个绘制的区域
*/
REPEAT (1),
/**
* 当绘制的图形尺寸大于Bitmap尺寸时,MIRROR模式下也会用Bitmap重复平铺整个绘图区域,与REPEAT不同的是,两个相邻的Bitmap互为镜像。
*/
MIRROR (2);
TileMode(int nativeInt) {
this.nativeInt = nativeInt;
}
final int nativeInt;
}
举例说明:
- CLAMP + CLAMP
private Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.child);
private BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); // CLAMP + CLAMP
paint.setShader(bitmapShader);
canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2, paint);
- REPEAT + REPEAT
private BitmapShader bitmapShader2 = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); // REPEAT + REPEAT
paint.setShader(bitmapShader2);
canvas.drawRect(0, 0, bitmap.getWidth() * 2.5F, bitmap.getHeight() * 2.5F, paint);
- REPEAT + CLAMP
private BitmapShader bitmapShader2 = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); // REPEAT + CLAMP
paint.setShader(bitmapShader2);
canvas.drawRect(0, 0, bitmap.getWidth() * 2.5F, bitmap.getHeight() * 2.5F, paint);
- MIRROR + MIRROR
private BitmapShader bitmapShader3 = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); // MIRROR + MIRROR
paint.setShader(bitmapShader3);
canvas.drawRect(0, 0, bitmap.getWidth() * 2.5F, bitmap.getHeight() * 2.5F, paint);
上下左右都是镜像图片
- MIRROR + REPEAT
private BitmapShader bitmapShader3 = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.REPEAT); // MIRROR + REPEAT
paint