Android – ¿Es posible declarar una máscara alfa directamente dentro de la definición de la capa-lista XML?

Una pregunta de novato

Tengo este layers.xml que utilizo como fuente para un ImageView. Y dos imágenes, mask.png y 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"/> 

En este momento la salida es sólo el png sobre la imagen. Quisiera que el png actuara como una máscara, cortando la imagen usando el canal alfa del png así: Introduzca aquí la descripción de la imagen

¿Es posible directamente dentro del xml, o tengo que hacerlo por código?

Gracias por su consejo 😉

Actualización: en el momento que he logrado mi objetivo con el código para reemplazar todo el 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(); 

Pon tu imagen de máscara en la carpeta drawable-nodpi.

De lo contrario, la escala será incorrecta.

He aquí algunos ejemplos de código de una aplicación. Después de la cámara agrega una máscara.

 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; } } 

Imagen de referencia muy útil: http://www.piwai.info/transparent-jpegs-done-right/

.png archivos .png pueden tener un canal alfa incluido al crearlos y Android puede utilizarlo para aislar la imagen tal y como se explica.

Cree un canal extra en GIMP o Photoshop o cualquier editor de imágenes que utilice. Se trata de un canal monocromo (256 tonos de blanco a negro). Haga una selección de la sección que desea ocultar haciendo clic en el canal alfa y llene el área de selección con negro. Invertir la selección, todavía en el canal alfa, y llenarlo con blanco. Guardar y exportar archivo .png como 24 bits con alfa (efectivamente 32 bits). Su archivo debe renderizar correctamente.

  • Android: la forma más fácil de cambiar el color de un archivo png
  • Imagen de png que aparece con fondo gris en android
  • Mapa de bits en Android: Tamaño de los recursos para mostrar como 50dp
  • Quiero guardar una imagen .png de AndroidPlot
  • Android: lee la imagen PNG sin alpha y decodifica como ARGB_8888
  • Optimización png android
  • Horrible desempeño de libPNG en iOS
  • Aplicación de una superposición (filtro de imagen) a un mapa de bits
  • A veces: <nine-patch> requiere un atributo src válido
  • Edita el png del ninepatch del android programly (cambia color)
  • Android: Transparencia PNG fallando con BitmapFactory.decodeStream (...) y carpeta de activos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.