Android——Paint.setXfermode(Xfermode xf)相关

一、参数Xfermode有三种子类:

AvoidXfermode

PixelXfermode

PorterDuffXfermode

前两种已经找不到了,因此介绍最后一种:PorterDuffXfermode

二、PorterDuffXfermode是一种图形混合模式,其中枚举了18中混合方式:

(其中Sa = src alpha 源图像透明度,Sc = src color 源图像颜色,Da = destination alpha 目标图像透明度,Dc = destination color 目标图像颜色)

  1. CLEAR /** [0, 0] */

    显示空白,因为所有像素点的alpha和color都是0

  2. SRC /** [Sa, Sc] */

    只保留源图像的color和alpha

  3. DST /** [Da, Dc] */

    只保留目标图像的color和alpha

  4. SRC_OVER /** [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */

    绘制源图像,在源图像像素点的其他地方绘制目标图像,源颜色,源图像其他地方用目标颜色

  5. DST_OVER /** [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */

    绘制源图像,在源图像像素点的其他地方绘制目标图像,目标颜色,目标图像的其他方用源颜色

  6. SRC_IN /** [Sa * Da, Sc * Da] */

    绘制源图像和目标图像的交集,用源图像颜色,颜色受目标图像的透明度影响

  7. DST_IN /** [Sa * Da, Sa * Dc] */

    绘制源图像和目标图像的交集,用目标图像颜色,颜色受源图像的透明度影响

  8. SRC_OUT (7) /** [Sa * (1 - Da), Sc * (1 - Da)] */

    在没有目标图像的地方绘制源图像,用源图像颜色,颜色的透明度与目标图像的透明度相反

  9. DST_OUT (8) /** [Da * (1 - Sa), Dc * (1 - Sa)] */

    在没有源图像的地方绘制目标图像,用目标图像颜色,颜色的透明度与源图像的透明度相反

  10. SRC_ATOP (9) /** [Da, Sc * Da + (1 - Sa) * Dc] */

    正常绘制目标图像,(相交部分)源图颜色受目标透明度影响,目标颜色部分与源图透明度相反

  11. DST_ATOP (10) /** [Sa, Sa * Dc + Sc * (1 - Da)] */

    正常绘制源图像,(相交部分)目标图颜色受源图像透明度影响,源图像颜色部分与目标图透明度相反

  12. XOR (11) /** [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc] */

    正常绘制两图不相交的部分,(相交部分)源图像颜色部分与目标图透明度相反,目标颜色部分与源图透明度相反

  13. DARKEN /** [Sa + Da - Sa*Da , Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */

    绘制图像,(相交部分,先如XOR相交部分显示)最后混合一层较暗的颜色(非完全不透明时按上面公式叠加一层暗的颜色,完全不透明则显示黑色)

  14. LIGHTEN /** [Sa + Da - Sa*Da , Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */

    绘制图像,(相交部分,先如XOR相交部分显示)最后混合一层较亮的图像(非完全不透明时按上面公式叠加一层亮的颜色,完全不透明则显示白色)

  15. MULTIPLY /** [Sa * Da, Sc * Dc] */

    绘制两图相交的部分,颜色为两图颜色的叠加,eg:蓝+红=紫

  16. SCREEN /** [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */

    绘制两张图,重叠的部分保留较白的一方(感觉像较白的一方显示在上面,较黑的颜色显示在下面)

  17. ADD /** Saturate(S + D) */

    饱和度叠加

  18. OVERLAY

叠加。像素是进行 Multiply (正片叠底)混合还是 Screen (屏幕)混合,取决于底层颜色,但底层颜色的高光与阴影部分的亮度细节会被保留;


三、使用方法:

  1. 先绘制目标图像

  2. 设置Xfermode,在上面18中任选一种

  3. 绘制源图像,会根据setXfermode的属性进行绘制最终的图像。

    @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawColor(Color.WHITE);
            int saveCount = canvas.saveLayer(0,0,1200,1300,mPaint);//绘制一个白色的底
            mPaint.setColor(Color.YELLOW);
            canvas.drawCircle(200,200,200,mPaint);//绘制目标图像:一个黄色的圆
            mPaint.setXfermode(porterDuffXfermode1);//设置模式
            mPaint.setColor(Color.BLUE);
            canvas.drawRect(rect,mPaint);//绘制源图像:一个蓝色的矩形,绘制后会显示叠加后的样子
            mPaint.setXfermode(null);//置空模式
            canvas.restoreToCount(saveCount);
    
        }

参考链接:Android Paint之 setXfermode PorterDuffXfermode 讲解_GAStudio的博客-CSDN博客_android porterduffxfermode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值