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
- ¿Cómo descodificar una imagen png codificada en Base64 y verlo en un ImageView?
- ¿Cuál es la diferencia entre usar vector drawable y un conjunto de .png para iconos en Android?
- Perder fondo transparente al descargar una imagen PNG externa
- Android: ¿Cómo descargar un archivo .png con Async y configurarlo con ImageView?
- Mostrar enormes imágenes en Android
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í:
¿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();
- Cómo agregar una imagen PNG como fondo en Android sin alteración (bandas)?
- Uso de JPEG como fondo en Android insted de PNG
- Png transparente en el mercado Android para activos de alta resolución
- Añadir un png al portapapeles en android
- ENOENT (ningún archivo o directorio) cuando hay un archivo allí
- Nexus 7, Android 4.4 y imagen png
- OpenGL ES 2.0 PNG canal alfa
- Cámara predeterminada para tomar una foto en android
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.