Paint之Xfermode实战

来源:互联网 发布:java gz解压缩 编辑:程序博客网 时间:2024/05/01 07:52

Paint之Xfermode实战

Xfermode定义

Xfermode在文档中的定义为:用于在绘图管道中实现自定义“传输模式”的对象的基类。PorterDuff.Mode类定义了所有可用的模式,当通过setXfermode(Xfermode xfermode)方法将Xfermode设置给Paint时,该画笔就应用了Xfermode,当设置为null时,则是取消设置。

三个子类

Xfermode有三个子类实现,包括AvoidXfermode、PixelXorXfermode、PorterDuffXfermode。其中AvoidXfermode、PixelXorXfermode已经弃用。

AvoidXfermode

AvoidXfermode用于颜色去除,从命名上看Avoid即避免显示某种颜色的意思。

AvoidXfermode(int opColor, int tolerance, Mode mode)AvoidXfermode构造函数有三个参数:opColor为基准色,tolerance为差值(0-255),mode为模式,有AVOID、TARGET两种模式。

在TARGET模式下,会将原图像中颜色为opColor,或与opColor的差值不超过tolerance的像素点,覆盖为画笔的颜色,当然要提前为画笔Paint设置好颜色。
在AVOID模式下,则相反,与opColor差不多的像素点保持不变,而剩下颜色的像素点会覆盖为画笔颜色。
下面是利用一张图片做的实例:

由图可见,在Avoid模式下,除去 黑色以及和黑色差值不超过100的像素点 会被渲染成蓝色。在Target模式下,黑色以及与黑色差值不超过150的像素点 会被渲染成蓝色。

注:由于此类实现在硬件加速条件下无效,所以需关闭Application或Activity的硬件加速属性。

PixelXorXfermode

PixelXorXfermode实现了简单的像素按位异或运算,计算公式为op ^ src ^ dst,op为基准色,src为原色,dst为画笔颜色。此转换不遵循预先约定,因此此模式始终返回不透明颜色(alpha == 255)。 因此,对混合颜色进行操作并不真正有用。

public PixelXorXfermode(int opColor)构造函数只包含一个基准色。

下面的示例可以展示出此模式的作用。

PorterDuffXfermode

PorterDuffXfermode是画笔转换模式的专业实现,PorterDuff.Mode枚举类中定义了16种可用的Alpha合成和5种颜色混合模式。如下图所示:

实例关键代码:

@Overrideprotected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //画布默认背景色是黑色,所以需要加一个透明背景    canvas.drawColor(0x00000000);    //先保存当前图层    int sc = canvas.saveLayer(0, 0, W, H, null, Canvas.ALL_SAVE_FLAG);    //声明一个新图层,画一个圆,作为目的图层    Canvas canvasDst = new Canvas(mDstB);    Paint paintDst = new Paint(Paint.ANTI_ALIAS_FLAG);    paintDst.setColor(0xFFFFCC44);    canvasDst.drawCircle(500, 500, 200, paintDst);    //声明一个新图层,画一个黑色半透明背景,作为原元图层    Canvas canvasSrc = new Canvas(mSrcB);    Paint paintSrc = new Paint(Paint.ANTI_ALIAS_FLAG);    paintSrc.setColor(0xd9000000);    canvasSrc.drawRect(0, 0, W, H, paintSrc);    //将原图层画到主图层上    canvas.drawBitmap(mSrcB, 0, 0, paint);    //为画笔设置DST_OUT模式,即显示目的颜色以外的颜色    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));    //将目的图层画到主图层上,产生混合效果    canvas.drawBitmap(mDstB, 0, 0, paint);    //返回到之前保存的图层,开始渲染    canvas.restoreToCount(sc);

最终显示出来的效果为黑色半透明上有一个镂空的圆形。可以用于App中常见的蒙层引导。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 慢性硬脑膜下血肿复发怎么办 佝偻病导致囟门晚闭怎么办 儿童液体补多了怎么办 脑脊液鼻漏3年了怎么办 结石掉到膀胱里怎么办 肾结石引起的腰疼怎么办 肾结石小但很疼怎么办 狗狗得了尿结石怎么办 生理期第四天必须游泳怎么办 碎石后吐的厉害怎么办 白细胞高红细胞高血尿怎么办? 早期肾癌术后复发该怎么办 肾结石因运动引起尿血怎么办 宝宝大便镜检阳性潜血怎么办 尿不尽刺痛带血怎么办 狗狗拉肚子拉血怎么办 肾血肿怎么办才吸收快 体检尿蛋白高3怎么办 肾炎会引起脸肿怎么办 12小孩尿蛋白3是怎么办 肝癌介入手术后肝功能不好怎么办 屁多且臭便秘怎么办 肝癌术1年后复发怎么办 怀孕便秘怎么办或大便太干拉不出 肠鸣便秘怎么办多尿 奥司他韦过量怎么办 憋的时间长尿痛怎么办 手过敏了怎么办最简单 肾结石不痛但是有血尿怎么办 儿童医院血液科挂不到号怎么办 搬完重物手抖怎么办 弯腰搬重物腰疼怎么办 搬了重物后腰疼怎么办 例假不走公务员体检血尿怎么办 憋尿久了尿不出来怎么办 憋尿引起的总有尿意怎么办 如果孕妇憋尿了怎么办 孕妇憋尿半个月怎么办 尿憋久了排空后膀胱疼怎么办 胸疼肚子疼不规则流血怎么办 上小便下面会痛怎么办