前言
从今年11月初开始到24号这段时间太忙了,到现在终于告一段落,由于此前我没有用过画布和画笔从而导致我在做的时候耗费了太多的时间,所以,趁着现在,总结一下知识点以备后用:
Paint.setXfermode方法干什么用?
该方法需要Xfermode对象,有AvoidXfermode、PixelXorXfermode、PorterDuffXfdrmode这3个子类,这里我用到的是PorterDuffXfdrmode类,我这里先仅仅说它吧,在说它之前先看看这3个子类的介绍;
AvoidXfermode:指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。
PixelXorXfermode:当覆盖已有的颜色时,应用一个简单的像素XOR操作。
PorterDuffXfermode:这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。
PorterDuffXfdrmode: 在用Android中的Canvas进行绘图时,可以通过使用PorterDuffXfermode将所绘制的图形的像素与Canvas中对应位置的像素按照一定规则进行混合,形成新的像素值,从而更新Canvas中最终的像素颜色值,如果不想再使用Xfermode可以setXfremode(null)即可,这样同一位置的像素就会被替换掉而不是混合;
什么是像素混合?
要绘制图形中的像素称作源像素(source,简称src),要绘制的图形在Canvas中对应位置内的像素称作目标像素(destination,简称dst)。源像素的ARGB四个分量会和Canvas上同一位置处的目标像素的ARGB四个分量按照Xfermode定义的规则进行计算,形成最终的ARGB值,然后用该最终的ARGB值更新目标像素的ARGB值。
图层?
1、canvas是支持图层渲染技术的,canvas默认就有一个图层layer,平时所调用的drawXXXX都是在默认的layer上进行的;
2、用canvas.saveLayer()方法产生的layer所有像素的ARGB值都是(0,0,0,0)即初始状态就是完全透明;
3、canvas.saveLayer方法会返回一个int值,用于表示layter的ID,在对这个新layer绘制完成之后可以调用canvas.restoreToCount(layer)或者canvas.restore把这个新layer绘制到canvas默认的layer上去,这样就完成了一个layer的绘制工作;
4、新建layer上面只有完全透明和完全不透明这2个情况,不存在第三种;
5、新建layer上某像素的Alpha是255即该像素完全不透明,那么会直接使用该像素的ARGB的值来作为Canvas上对应位置上像素的颜色值,即覆盖掉;
6、新建layer上某像素的Alpha是0即完全透明,那么会保留canvas上对应位置上的像素的颜色值;
顺序?
aint.setXfermode()这个方法就是把当前的Canvas上的内容当做DST,如果我们在调用Canvas.saveLayer()方法之后,就把当前的层上的内容作为DST了,这个时候大家应该就知道了为什么在设置Paint.setXfermode()的时候,要在Canvas.saveLayer()和Canvas.restoreToCount()之间使用了,就是为了不影响底下Canvas已经画好的图,Canvas.restoreToCount()调用之后,两个层叠起来就是整个View上的图像了
常用模式
1、clear:清除模式,即最终所有点的像素的alpha和color都是0,即白色透明;
2、src:通过名字就能看出来只保留源图像像素的alpha和color;
3、dst:只保留目标图像像素的alpha和color;
4、src_over:从名字上看,源图像浮在目标图像上面,浮在上面之后,源图像遮挡住重叠部分;
5、dst_over:目标图像浮在上面,目标图像遮挡住重叠部分;
6、src_in:从名字上看in是重叠的意思,源图形在目标图形的里面,即两者重叠的地方绘制源图形且绘制的效果会受到目标图形对应地方透明度的影响;
7、dst_in:目标图形在源图形里面,即两者重叠的地方绘制目标图形且绘制的效果受到源图形对应地方透明度的影响;
8、src_out:类比于in,out应该是在非重叠的地方绘制源图像,在不相交的地方绘制源图像,相交处根据目标alpha进行过滤,目标色完全不透明时则完全过滤,完全透明则不过滤;
9、dst_out:在不相交的地方绘制目标图像,相交处根据源图像alpha进行过滤,完全不透明处则完全过滤,完全透明则不过滤;
10、Src_atop:源图像和目标图像相交处绘制源图像,不相交的地方绘制目标图像,并且相交处的效果会受到源图像和目标图像alpha的影响;
11、Dst_atop:源图像和目标图像相交处绘制目标图像,不相交的地方绘制源图像,并且相交处的效果会受到源图像和目标图像alpha的影响;
12、Xor:在不相交的地方按原样绘制源图像和目标图像,相交的地方受到对应alpha和色值影响,按上面公式进行计算,如果都完全不透明则相交处完全不绘制;
13、Darken:同样的,这样的混合效果可以直接在PS里进行简单模拟,创建三个一样的图层,选择对应的混合模式,对于效果表示是一致的,同样的,这样的混合效果可以直接在PS里进行简单模拟,创建三个一样的图层,选择对应的混合模式,对于效果表示是一致的;
14、Lighten:可以和 DARKEN 对比起来看,DARKEN 的目的是变暗,LIGHTEN 的目的则是变亮,如果在均完全不透明的情况下 ,色值取源色值和目标色值中的较大值,否则按上面算法进行计算;
15、Multiply:正片叠底,即查看每个通道中的颜色信息,并将基色与混合色复合。结果色总是较暗的颜色。任何颜色与黑色复合产生黑色。任何颜色与白色复合保持不变。当用黑色或白色以外的颜色绘画时,绘画工具绘制的连续描边产生逐渐变暗的颜色;
16、Screen:滤色,滤色模式与我们所用的显示屏原理相同,所以也有版本把它翻译成“屏幕”;简单的说就是保留两个图层中较白的部分,较暗的部分被遮盖;当一层使用了滤色(屏幕)模式时,图层中纯黑的部分变成完全透明,纯白部分完全不透明,其他的颜色根据颜色级别产生半透明的效果;
17、Add:饱和度叠加
18、Overlay:像素是进行 Multiply (正片叠底)混合还是 Screen (屏幕)混合,取决于底层颜色,但底层颜色的高光与阴影部分的亮度细节会被保留
参考链接:
http://blog.csdn.net/iispring/article/details/50472485
http://blog.csdn.net/tianjian4592/article/details/44783283