android android-layout png mask alphablending

Android: ¿es posible declarar una máscara alfa directamente dentro de la definición XML de la lista de capas?



android-layout png (2)

Ponga su imagen de máscara en la carpeta drawable-nodpi.

De lo contrario, la escalada será incorrecta.

Aquí hay un código de ejemplo de una aplicación. Después de la cámara se 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; } }

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 solo el png sobre la imagen. Me gustaría que el png actúe como una máscara, recortando la imagen usando el canal png alfa así:

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

Gracias por su consejo ;)

actualización: en el momento en que logré mi objetivo utilizando el código para reemplazar la ImageView completa

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();


.png archivos .png pueden tener un canal alfa incluido cuando los creas y Android puede usarlo para aislar la imagen a medida que lo explicas.

Cree un canal adicional en GIMP o Photoshop o el editor de imágenes que use. Este será un canal monocromo (256 tonos de blanco a negro). Haga una selección de la sección que desea enmascarar HACIA FUERA, haga clic en el canal alfa y rellene el área de selección con negro. Invertir la selección, aún en el canal alfa, y rellenarla con blanco. Guarde y exporte el archivo .png 24 bits con alfa (efectivamente 32 bits). Su archivo debe renderizarse correctamente.