Итак, я попробовал код здесь: Создание ImageView с маской. Я использую следующие изображения в качестве оригинала и маски:
Однако я получаю результат:
Обратите внимание, что фон фона не черный, но голосный свет (который на галактике nexus выглядит очень бледно-серым, а не совсем белым). Второе изображение - результат, который я получаю, когда элемент выбран в виде списка.
Если вместо этого я создаю новый битмап, используя тот же алгоритм, а затем передаю его в представление изображения вместо переопределения 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 вместо предварительного создания растрового изображения, потому что он работает только для растровых изображений в качестве источника и маски. Я хочу иметь возможность делать это с другими чертежами, такими как градиенты и сплошные цвета, но в этих случаях ширина и высота не заданы.