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

pdog
  • 573

首先贴出关键代码,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);*/
回复
阅读 2k
1 个回答
pdog
  • 573
✓ 已被采纳

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

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


drawBitmap(src..);
setXfermode(Mode);
drawBitmap(dst...);
setXfermode(null);
宣传栏