PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)

文章探讨了PorterDuffXferMode在Android中使用时遇到的问题,包括错误显示、硬件加速的影响以及如何实现预期效果。通过实验得出结论:硬件加速可能干扰效果,需要关闭;两个相同大小的bitmap且背景透明才能得到预期的XferMode效果。作者强调,不同位置的bitmap会产生不同效果,并分享了避免入坑的经验。
摘要由CSDN通过智能技术生成

菜鸡wing遇敌PorterDuffXferMode,不料过于轻敌,应战吃力。随后与其大战三天三夜,三百余回合不分胜负。幸得 @咪咪控 相助,侥幸获胜。

关键字:PorterDuffXferMode  错误 不正确  不达到预期  bug


上一篇带来一个使用PorterDuffXferMode  做的 水波纹loadingview,中间遇到了点小困难。


(说人话)  PorterDuffXferMode总是不能按照效果图预期的效果执行。关于PorterDuffXferMode的错误显示是一个对初学者十分深的坑,到底是bug呢,还是有需要注意的地方呢。这里就跟随我 带上手电筒,去一探究竟。


转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50534175


首先,大家都知道有一个图片:


然后,大部分时候 是看到了觉得很神奇,就跃跃欲试,尤其是src_in  和dstIn可以实现遮罩效果,例如圆角图片 圆形图片都用了这种模式。

于是就挨个测试各种模式是否生效,结果往往不能达到预期效果。我们来做个测试。

从最简单的开始:

1.直接在canvas上面绘制图形

  @Override
    protected void onDraw(Canvas canvas) {
        //dst
        canvas.drawRect(20,20,80,80,mDstPaint);

        //src
        canvas.drawCircle(30,30,30,mSrcPaint);
        
    }

原图效果是这样的:


现在加一个mode上来,XOR

    @Override
    protected void onDraw(Canvas canvas) {
        //dst
        canvas.drawRect(20,20,80,80,mDstPaint);
        mSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
        //src
        canvas.drawCircle(30,30,30,mSrcPaint);

    }
跑起来的结果是这样的:

WTF!!?? 这是什么鬼。不应该是相交部分消失吗。 网上说“硬件加速”对这个有影响,那么在构造器里关闭硬件加速试一下:

 public TestView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mDstPaint = new Paint();
        mSrcPaint = new Paint();
        mDstPaint.setColor(Color.YELLOW);
        mSrcPaint.setColor(Color.BLUE);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

运行的结果:

这下正常了。相交的部分消失了。

结论1:硬件加速对PorterDuffXferMode有影响,使用前请关闭硬件加速。

那么这下真的天下太平了吗?nonono~不要太天真,不然怎么能叫万丈深渊呢。

继续试验其他模式:  将模式改为SRC_IN


WTF?????跟效果图根本不一致好吗!!!! 在试试DST_IN


你确定你没有在逗我????  怎么是这个鬼东西。  (当时鼓捣了我三天四夜,一直在日狗,不过先别急,慢慢来。)

为什么一定要按照那个效果图来呢。。。 因为特么的那个图是官方

  • 37
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值