1.PorterDuffXfermode
1.1 介绍
PorterDuffXfermode
有点类似数学中的交集,并集,用来两个图像间的混合显示模式,设置的是两个图层交集区域的显示方式,dst
是下层,先画的图形;src
是上层,后画的图形。
1.2 构造方法
PorterDuffXfermode(PorterDuff.Mode mode);
构造方法中只需一个参数,PorterDuff.Mode
,Mode
是PorterDuff
这个类中的一个枚举类,共有18个枚举值。
2. 18种模式
模式 | 效果 |
---|---|
PorterDuff.Mode.CLEAR |
上层绘制不会提交到画布,并把与下层交集部分也清除 |
PorterDuff.Mode.SRC |
显示上层绘制,此时下层绘制也会显示 |
PorterDuff.Mode.DST |
显示下层绘制,而上层不会绘制 |
PorterDuff.Mode.SRC_OVER |
正常显示,上层叠盖在下层之上 |
PorterDuff.Mode.DST_OVER |
上下层都显示,下层在上 |
PorterDuff.Mode.SRC_IN |
将交集显示在下层绘制的区域 |
PorterDuff.Mode.DST_IN |
显示下层绘制 |
PorterDuff.Mode.SRC_OUT |
取非交集区域 |
PorterDuff.Mode.DST_OUT |
取下层非交集区域 |
PorterDuff.Mode.SRC_ATOP |
取上层的交集区域和下层的非交集区域 |
PorterDuff.Mode.DST_ATOP |
下层在上层之上 |
PorterDuff.Mode.XOR |
去除两层的交集区域 |
PorterDuff.Mode.DARKEN |
取两层全部区域,交集区域变暗 |
PorterDuff.Mode.LIGHTEN |
取两层全部区域,交集区域变亮 |
PorterDuff.Mode.MULTIPLY |
取下层全部区域,交集区域色彩叠加,正片叠底 |
PorterDuff.Mode.SCREEN |
取两层全部区域,交集区域变透明 |
PorterDuff.Mode.ADD |
饱和度叠加 |
PorterDuff.Mode.OVERLAY |
对黑白无效,显示两层颜色中和后的中间色 |
3.PorterDuff.Mode.CLEAR实践
1.先画一个黄色的圆
paint.setColor(0xFFFFCC44);
int r = width / 3;
canvas.drawCircle(r,r,r,paint);
2.再画一个矩形,并设置PorterDuffXfermode为CLEAR
paint.setColor(0xFF66AAFF);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawRect(r, r, r * 2.7f, r * 2.7f, paint);
paint.setXfermode(null);
3. 一定要注意 ,一定要注意,一定要注意,此模式不支持硬件加速,需关闭
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
3. 简单圆形图片实践
1.先绘制下层圆形
canvas.drawCircle(getWidth() / 2,getHeight() / 2,Math.min(getWidth(),getHeight()) / 2,paint);
2.绘制图片,并设置过渡模式为:SRC_IN,将交集显示在下层绘制的区域
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.img);
canvas.drawBitmap(bitmap,0,0,paint);
paint.setXfermode(null);