Android. Можно ли объявить альфа-маску непосредственно в определении XML-списка слоев?

Новый вопрос

У меня есть этот layer.xml, который я использую в качестве источника для ImageView. И два изображения, mask.png и image.jpg

layers.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <bitmap android:src="@drawable/image" android:gravity="center"/> </item> <item> <bitmap android:src="@drawable/mask" android:gravity="center"/> </item> </layer-list> 

ImageView:

 <ImageView android:id="@+id/img_B" android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/layers"/> 

На данный момент вывод – это только png над изображением. Я бы хотел, чтобы png действовал как маска, обрезая изображение с помощью альфа-канала png так: Введите описание изображения здесь

Возможно ли это непосредственно в xml, или мне нужно сделать это с помощью кода?

Спасибо за ваш совет 😉

Обновление: на данный момент я достиг своей цели, используя код, чтобы заменить весь ImageView

 ImageView img = (ImageView) findViewById(imgID); Canvas canvas = new Canvas(); Bitmap mainImage = BitmapFactory.decodeResource(getResources(), R.drawable.img); Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.mask); 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(mask, 0, 0, paint); paint.setXfermode(null); img.setImageBitmap(result); img.invalidate(); 

Solutions Collecting From Web of "Android. Можно ли объявить альфа-маску непосредственно в определении XML-списка слоев?"

Поместите изображение маски в папку drawable-nodpi.

В противном случае масштабирование будет неправильным.

Вот пример кода из приложения. После камеры она добавляет маску.

 public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE) // && resultCode == RESULT_OK ) { try { Bitmap cameraBmp = MediaStore.Images.Media.getBitmap( State.mainActivity.getContentResolver(), Uri.fromFile(Utils.tempFileForAnImage()) ); cameraBmp = ThumbnailUtils.extractThumbnail(cameraBmp, 256, 256); Matrix m = new Matrix(); m.postRotate(Utils.neededRotation(Utils.tempFileForAnImage())); // NOTE incredibly useful trick for cropping/resizing square // http://stackoverflow.com/a/17733530/294884 cameraBmp = Bitmap.createBitmap(cameraBmp, 0, 0, cameraBmp.getWidth(), cameraBmp.getHeight(), m, true); // so, cameraBmp is now a Bitmap. Let's add the mask!! // see Shiomi Schwartz's original!! http://stackoverflow.com/questions/8630365 Bitmap mask = BitmapFactory.decodeResource( getResources(), R.drawable.mask_android_256); // NOTE THE MASK ** MUST ** BE IN YOUR nodpi folder Bitmap result = Bitmap.createBitmap( 256,256, Bitmap.Config.ARGB_8888); Canvas cc = new Canvas(); cc.setBitmap(result); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); cc.drawBitmap(cameraBmp, 0, 0, null); cc.drawBitmap(mask, 0,0, paint); // so, cameraBmp is now a Bitmap but it has been masked yourImageViewForTheUser.setImageBitmap(result); // make a "baos" ... we want PNG in this case .. ByteArrayOutputStream baos = new ByteArrayOutputStream(); result.compress(Bitmap.CompressFormat.PNG, 0, baos); imageBytesRESULT = baos.toByteArray(); // typically you want the result as image bytes, example to send to Parse } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return; } } 

Очень удобное справочное изображение: http://www.piwai.info/transparent-jpegs-done-right/

.png файлы могут иметь альфа-канал, включенный при их создании, и Android может использовать это, чтобы изолировать изображение, как вы объясните.

Создайте дополнительный канал в GIMP или Photoshop или любой другой редактор изображений, который вы используете. Это будет монохромный канал (256 оттенков от белого до черного). Сделайте выбор раздела, который вы хотите замаскировать, нажмите на альфа-канал и заполните область выделения черным цветом. Инвертируйте выделение, все еще в альфа-канал, и заполните его белым. Сохраните и экспортируйте файл .png как 24 бит с альфой (фактически 32 бит). Ваш файл должен отображаться правильно.