只有一个构造函数,无其他方法 AvoidXfermode就是用一个图形遮住另外一个图形,然后按指定模式和目标颜色(进行相应的覆盖)
他不支持硬件加速,高于16 版本的系统没效果,所以要使用这个模式必须关闭硬件加速。另外这个模式被废弃了,也不是很建议使用
枚举类AvoidXfermode.Mode 值 AVOID, TARGET
opColor目标颜色值
tolerance:颜色容差值,这个是基于目标色opColor来说的容差值。取值0代表不能有容差即必须和目标色opColor一模一样,如果是255代表最大容差
AvoidXfermode.Mode mode:枚举类中的两个参数
AVOID:只会在给定的颜色值和 op-color “不一样” 的地方进行绘制;
Target:只会在给定的颜色值和 op-color “一样” 的地方进行绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint mpaPaint=new Paint();
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.mipmap.b);//A处代码
canvas.drawBitmap(bitmap, 0, 0, mpaPaint); //B处
canvas.drawBitmap(bitmap,0,bitmap.getHeight()+30,mpaPaint); //C处
mpaPaint.setColor(Color.RED);//E处
AvoidXfermode ax=new AvoidXfermode(Color.BLUE,150, AvoidXfermode.Mode.TARGET);//F处
mpaPaint.setXfermode(ax);//G处
Rect rect=new Rect(0,bitmap.getHeight()+30,bitmap.getWidth(),bitmap.getHeight()*2+30); //H处
canvas.drawRect(rect, mpaPaint);}//I处
如上:
Demo结合图形来讲解AvoidXfermode的具体用法
A、B处代码:加载一个位图并绘制到canvas画布上,如图1效果
C处再绘制一个和图1一样的图形
E、F、G处:给画笔设置程红色、创建AvoidXfermode,目标颜色是blue蓝色,容差在150,模式是TARGET(),给画笔设置AvoidXfermode
H、I处:绘制一个和图1一样大小的矩形如图3、并且他的位置和C处绘制的图形在同一个位置
最后形成图2效果,注意看图1蓝色部分,在图2变成了红色
总结:其实这里是用一个矩形覆盖在C处绘制的图形上,但是我们添加了AvoidXfermode模式,
AvoidXfermode模式中TARGET限定这2个图形重合时矩形的红色只能替换包含换目标色BLUE的地方,其他地方则不变。故图1中蓝色部分便成了图2中红色部分
如果我们AvoidXfermode模式选择AVOID,那么红色矩形则会覆盖除目标色blue以后的所有地方
注意:这里为了展示区别所以在C处多画了一个图形出来,平时运用时没必要
口诀:其实AvoidXfermode就是用一个图形遮住另外一个图形,然后按指定模式和目标颜色(进行相印的覆盖)
这种图像混合模式也在16api时被舍弃了,不建议使用,同上高于16系统的需要关闭硬件加速,
他的作用(效果)就是用一个带有alpha通道的颜色和其他图形(像素色彩值)进行异或运算把得到的不透明颜色值设置进图像中
Paint mpaPaint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.b);
canvas.drawBitmap(bitmap, 0, 0, mpaPaint);
PixelXorXfermode px=new PixelXorXfermode(Color.BLUE);
mpaPaint.setARGB(255, 211, 53, 243);
mpaPaint.setXfermode(px);
Rect rect = new Rect(0,0, bitmap.getWidth(), bitmap.getHeight());
canvas.drawRect(rect, mpaPaint);
总结:记住opColor传递进去的目标颜色必须是带有alpha通道的才有效果
在Xfermode三个子类中,前面的AvoidXfermode和PixelXfermode都过时了,废弃了也不推荐使用了,这里介绍的PorTerDuffXfermode是功能最齐全,也是最推荐使用的。
PorterDuffXfermode使用也是图形混合模式的一种,他非常强大,他只有一个构造函数,而且参数也只有一个PorterDuff.Mode,这个参数有16中模式。可以构建无数强大的存在!!