请教一下PorterDuffXfermode会互相影响吗?

发布于 2022-09-05 07:31:35 字数 2210 浏览 16 评论 0

首先贴出关键代码,onDraw(Canvas canvas)的代码

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 使用 paint.setXfermode() 设置不同的结合绘制效果

        // 别忘了用 canvas.saveLayer() 开启 off-screen buffer

        canvas.saveLayer(null, null, Canvas.ALL_SAVE_FLAG);

        canvas.drawBitmap(bitmap1, 0, 0, paint);
        // 第一个:PorterDuff.Mode.SRC
        paint.setXfermode(xfermode);
        canvas.drawBitmap(bitmap2, 0, 0, paint);



        canvas.drawBitmap(bitmap1, bitmap1.getWidth() + 100, 0, paint);
        paint.setXfermode(xfermode1);
        // 第二个:PorterDuff.Mode.DST_IN
        canvas.drawBitmap(bitmap2, bitmap1.getWidth() + 100, 0, paint);




        canvas.drawBitmap(bitmap1, 0, bitmap1.getHeight() + 20, paint);
        paint.setXfermode(xfermode2);
        // 第二个:PorterDuff.Mode.DST_IN
        canvas.drawBitmap(bitmap2, 0, bitmap1.getHeight() + 20, paint);



        canvas.drawBitmap(bitmap1, bitmap1.getWidth() + 100, bitmap1.getHeight() + 20, paint);
        paint.setXfermode(xfermode3);
        // 第二个:PorterDuff.Mode.DST_IN
        canvas.drawBitmap(bitmap2, bitmap1.getWidth() + 100, bitmap1.getHeight() + 20, paint);

        canvas.restore();
    }

显示效果是这样的

clipboard.png

PorterDuffXfermode(PorterDuff.Mode.SRC);
    xfermode1 = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
    xfermode2 = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);
    xfermode3 = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);

当我把xfermode2改成SRC_OVER的时候,就显示成为这样了,

clipboard.png

右下角的显示正是我的需求,但是当我把onDraw()方法里面的第三部分代码注释掉了以后,效果又不显示了

    //代码注释掉了
  /*  canvas.drawBitmap(bitmap1, 0, bitmap1.getHeight() + 20, paint);
        paint.setXfermode(xfermode2);
        // 第二个:PorterDuff.Mode.DST_IN
        canvas.drawBitmap(bitmap2, 0, bitmap1.getHeight() + 20, paint);*/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

音盲 2022-09-12 07:31:35

在绘制多个组合bitmap的时候 在“每对”Bitmap中间插入paint.setXfermode(null); 避免XferMode影响非目标对象

drawBitmap(src..);
setXfermode(Mode);
drawBitmap(dst...);
setXfermode(null);


drawBitmap(src..);
setXfermode(Mode);
drawBitmap(dst...);
setXfermode(null);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文