我尝试了这里的代码:创建带有遮罩的ImageView。我使用以下图像作为原始和遮罩:
然而,我得到的结果是这样的:
请注意,窗口背景不是黑色,而是holo light(在Galaxy Nexus上看起来像非常淡的灰色,不完全是白色)。第二张图片是当列表视图中选择一个项目时所得到的结果。
如果我改为使用相同算法创建一个新的Bitmap,然后将其传递给ImageView而不是覆盖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上完成它,而不是预先创建位图,因为它仅适用于位图作为源和蒙版。我希望能够在其他可绘制对象上执行此操作,例如渐变和纯色,但在这些情况下宽度和高度没有设置。