淘先锋技术网

首页 1 2 3 4 5 6 7
1:Xfermode介绍
  • 什么是Xfermode
    这个不好解释,api翻译出来的也很拗口。习惯性叫图片混合模式
    api的描述大概是:Xfermode是在绘图通道中自定义“传输模式”的基类。静态函数创建可以调用或者返回任意作为模式枚举指定的预定义子类实例。当Xfermode分配给Paint,然后绘制对象与Paint就具备了所添加的xfermode,就是给paint画笔设置一个xfermode某种模式(子类的某个实例),然后使用paint在已有的图形上进行绘制,这时候设计到2个图形的重合(混合),这时候就按照设定的模式来显示(如重合部分颜色是覆盖,剪辑掉…)
  • 知道的直接子类AvoidXfermode、PixelXorXfermode、PorterDuffXfermode
  • 构造函数AvoidXfermode(int opColor, int tolerance, AvoidXfermode.Mode mode)
2:AvoidXfermode

只有一个构造函数,无其他方法 AvoidXfermode就是用一个图形遮住另外一个图形,然后按指定模式和目标颜色(进行相应的覆盖)
他不支持硬件加速,高于16 版本的系统没效果,所以要使用这个模式必须关闭硬件加速。另外这个模式被废弃了,也不是很建议使用

AvoidXfermode(int opColor, int tolerance, AvoidXfermode.Mode mode)

枚举类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, , , mpaPaint); //B处
canvas.drawBitmap(bitmap,,bitmap.getHeight()+,mpaPaint); //C处
mpaPaint.setColor(Color.RED);//E处
AvoidXfermode ax=new AvoidXfermode(Color.BLUE,, AvoidXfermode.Mode.TARGET);//F处
mpaPaint.setXfermode(ax);//G处
Rect rect=new Rect(,bitmap.getHeight()+,bitmap.getWidth(),bitmap.getHeight()*+); //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就是用一个图形遮住另外一个图形,然后按指定模式和目标颜色(进行相印的覆盖)

3:PixelXorXfermode

这种图像混合模式也在16api时被舍弃了,不建议使用,同上高于16系统的需要关闭硬件加速,
他的作用(效果)就是用一个带有alpha通道的颜色和其他图形(像素色彩值)进行异或运算把得到的不透明颜色值设置进图像中

Paint mpaPaint = new Paint();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.b);
canvas.drawBitmap(bitmap, , , mpaPaint);
PixelXorXfermode px=new PixelXorXfermode(Color.BLUE);
mpaPaint.setARGB(, , , );
mpaPaint.setXfermode(px);
Rect rect = new Rect(,, bitmap.getWidth(), bitmap.getHeight());
canvas.drawRect(rect, mpaPaint);

总结:记住opColor传递进去的目标颜色必须是带有alpha通道的才有效果

4:PorterDuffXfermode(18种图形混合模式)

在Xfermode三个子类中,前面的AvoidXfermode和PixelXfermode都过时了,废弃了也不推荐使用了,这里介绍的PorTerDuffXfermode是功能最齐全,也是最推荐使用的。
PorterDuffXfermode使用也是图形混合模式的一种,他非常强大,他只有一个构造函数,而且参数也只有一个PorterDuff.Mode,这个参数有16中模式。可以构建无数强大的存在!!
这里写图片描述