Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android位图掩蔽_Android_Canvas_Bitmap_Masking - Fatal编程技术网

Android位图掩蔽

Android位图掩蔽,android,canvas,bitmap,masking,Android,Canvas,Bitmap,Masking,我有一个位图,我正在上面应用两个遮罩。当我在位图的右侧应用遮罩时,效果很好,但之后当我在同一位图的底部应用遮罩时,由于重新设置遮罩,位图上有一个区域再次出现。我试着用下面的图片解释这个问题。圈出的区域正在引发问题。我希望该区域在重新着色后仍保持透明 下面是我的屏蔽函数代码截取 paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); .

我有一个位图,我正在上面应用两个遮罩。当我在位图的右侧应用遮罩时,效果很好,但之后当我在同一位图的底部应用遮罩时,由于重新设置遮罩,位图上有一个区域再次出现。我试着用下面的图片解释这个问题。圈出的区域正在引发问题。我希望该区域在重新着色后仍保持透明

下面是我的屏蔽函数代码截取

paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
.......

public void setRightMask(MyBitmap bmp, Type type) {
    int maskIndex = -1;
    switch(type){
        case CONCAVE:
            maskIndex = 0;
            break;
        case CONVEX:
            maskIndex = 6;
            break;

    }

    Bitmap result = Bitmap.createBitmap((int)bmp.getWidth(), (int)bmp.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(bmp.getBmp(), 0, 0, null);
    canvas.drawBitmap(masks[maskIndex].getBmp(), bmp.getWidth() - masks[maskIndex].getBmp().getWidth(), 0, paint);
    bmp.setBmp(result);
}


public void setBottomMask(MyBitmap bmp, Type type) {
    int maskIndex = -1;
    switch(type){
        case CONCAVE:
            maskIndex = 1;
            break;
        case CONVEX:
            maskIndex = 7;
            break;

    }

    Bitmap result = Bitmap.createBitmap((int)bmp.getWidth(), (int)bmp.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(bmp.getBmp(), 0, 0, null);
    canvas.drawBitmap(masks[maskIndex].getBmp(), 0, bmp.getHeight() - masks[maskIndex].getBmp().getHeight(), paint);
    bmp.setBmp(result);
}

一种解决方案是使用黑色透明遮罩代替黑白。尽管使用黑色透明遮罩,您首先必须绘制遮罩,然后绘制您希望被这些遮罩裁剪的任何内容

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
而不是中的Mode.DST_