安卓在自定义 View 或写获取圆角或者圆形图片工具的时候可能会用到这个画笔模式,但是发现之前理解的有些不正确,所以记录一下。目前只用到了两种,所以先记录一下这两种的使用,即:
PorterDuff.Mode.SRC_IN 和 PorterDuff.Mode.DST_IN,效果如下图:
DST是下层图形,SRC是上层图形。这样看来,这两种模式可以理解为上下两层图形的交集部分,只不过是交集部分显示的内容取决于上层还是下层内容的区别。DST_IN 内容取决于下层,SRC_IN 内容取决于上层。
下面来写代码看一下效果。
新建一个项目,布局放一个 ImageView 就可以了,代码如下:
//1.新建一个用于画图形的 bitmap 对象
Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
//2.先画一个红色的矩形
paint.setColor(Color.RED);
canvas.drawRect(0, 0, bitmap.getWidth(), bitmap.getHeight(), paint);
paint.setColor(Color.YELLOW);
//3.设置模式,再画一个黄色的圆
paint.setXfermode(
new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, bitmap.getHeight() / 2, paint);
//4. 将所画内容设置到 ImageView 上显示
iv1.setImageBitmap(bitmap);
代码就这么多,根据上面的说明,我们的预期可能是就显示上层黄色的圆,因为交集部分就是圆的区域,而颜色是取决于上层的。但实际的效果并不是只显示一个黄色的圆,如图:
我们把模式改为 DST_IN,看会不会根据预期只显示一个红色的圆。但实际上并不是一个红色的圆形,而是整个红色的矩形。图就不贴了。
这怎么都跟上面图示的不一样呢?怎么才能达到最上面说明的效果呢?我们来先画圆试一下。代码把上面画矩形和画圆的两行对调一下就可以了。这时候圆是红色的,矩形是黄色的了。效果如下:
DST_IN
SRC_IN
我们看到这两种情况是符合我们的预期的。
比较上面四种情况,我们发现:
1.如果下层区域大于上层区域(即下层矩形,上层圆),显示图形的大小肯定是矩形的区域,只不过上面圆形的颜色会根据设置模式不同一样。只看到一个红色举行的情况其实只不过是交集部分的颜色也是红色而已。
2.如果下层区域小于上层区域(即下层圆上层矩形),显示图形的区域肯定只是圆形的区域,颜色会根据模式模式的不同显示的不同。
最后总结一波:
这两种模式并不是只是显示交集部分,而是两层都会显示的,显示的区域由下层(即 DST 层)决定,交集部分由设置的模式决定。