所以我尝试了这里的代码:Creating an ImageView with a mask。我使用以下图像作为原始图像和蒙版:
但是,我得到的结果是这样的:
请注意,窗口背景不是黑色,而是全息光(在银河系上看起来像非常淡的灰色,而不是完全白色)。第二张图片是我在列表视图中选择项目时得到的结果。
相反,如果我使用相同的算法创建一个新的位图,然后将其传递给图像视图而不是覆盖 onDraw(),它会正确绘制:
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
我得到了预期的结果:
请注意,淡化已正确应用。这在进行选择时更加明显。
那么 ImageView 的 onDraw 方法是如何创建这个黑色背景而不是让窗口背景显示出来的呢?有趣的是,如果原始图像本身具有一定的透明度,则尊重该透明度,例如:
我无法自己弄清楚。我宁愿能够在 onDraw 上执行此操作,而不是预先创建位图,因为它仅适用于作为源和掩码的位图。我希望能够使用渐变和纯色等其他可绘制对象来做到这一点,但在这些情况下,宽度和高度没有设置。