在学习自定义View开发进阶的过程中,对图像裁剪的两种方式做一个简单的笔记。
学习资源参考Hencoder开发进阶。
- canvas.clipXXX()通过画布裁剪图片
canvas.save();
canvas.clipRect(300,300,700f,1000f);
canvas.drawBitmap(bitmap, 0,0,null);
canvas.restore();
- paint.setShader(bitmapShader)设置图片的着色器
canvas.drawXXX()画布设计基本形状
BitmapShader
构造方法:
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
参数:
bitmap:用来做模板的 Bitmap 对象
tileX:横向的 TileMode
tileY:纵向的 TileMode。
TileMode延申部分的着色模式设置:
MIRROR:镜像
REPEAT:重复
CLAMP: 延申像素值
用 Bitmap 来着色(终于不是渐变了)。其实也就是用 Bitmap 的像素来作为图形或文字的填充。大概像这样:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.desktop, options);
BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP,Shader.TileMode.CLAMP);
mpaint = new Paint();
mpaint.setShader(shader);
canvas.drawCircle(300f,300f,300f,mpaint);
效果如下:
ComposeShader 混合着色器
两个着色器混合使用的效果。
构造方法:ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)
参数:
shaderA, shaderB:两个相继使用的 Shader
mode: 两个 Shader 的叠加模式,即 shaderA 和 shaderB 应该怎样共同绘制。它的类型是 PorterDuff.Mode 。
// ComposeShader:结合两个 Shader
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.SRC_OVER);
paint.setShader(shader);
注意:ComposeShader() 在硬件加速下是不支持两个相同类型的 Shader 的,所以这里也需要关闭硬件加速才能看到效果
PorterDuff.Mode
PorterDuff.Mode 是用来指定两个图像共同绘制时的颜色策略的。它是一个 enum,不同的 Mode 可以指定不同的策略。「颜色策略」的意思,就是说把源图像绘制到目标图像处时应该怎样确定二者结合后的颜色,而对于 ComposeShader(shaderA, shaderB, mode) 这个具体的方法,就是指应该怎样把 shaderB 绘制在 shaderA 上来得到一个结合后的 Shader。
mode的混合效果有:
源图像和目标图像:
第一类:
Alpha 合成:
第二类,混合,也就是 Photoshop 等制图软件里都有的那些混合模式(multiply darken lighten 之类的)。这一类操作的是颜色本身而不是 Alpha 通道,并不属于 Alpha 合成,所以和 Porter 与 Duff 这两个人也没什么关系。