2011-12-25 10 views
30

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

Tengo este layers.xml que utilizo como fuente para un ImageView. Y dos imágenes, mask.png y imagen.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 el momento de la salida es sólo el png sobre la imagen. Me gustaría que el png para actuar como una máscara, la saturación de la imagen utilizando el canal alfa PNG, así: enter image description here

Es eso posible directamente en el xml, o tengo que hacerlo por código?

Gracias por su consejo;)

actualización: en el momento en que he logrado mi objetivo utilizando el código de 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(); 
+0

esa fue una buena manera de señalarme aquí! No estoy seguro de esto, pero déjame mirar un poco y responderte. – Shaunak

+2

Tienes que poner esto como una respuesta aceptada porque esto me acaba de salvar! – DeeV

+0

La respuesta dada no responde a la pregunta original, todavía me pregunto si una capa de máscara podría declararse utilizando la lista de capas xml –

Respuesta

-3

.png archivos pueden tener un canal alfa incluido cuando se crea ellas y Android puede usar eso para aislar la imagen mientras explicas.

Crea un canal adicional en GIMP o Photoshop o en el editor de imágenes que uses. Este será un canal monocromático (256 tonos de blanco a negro). Haga una selección de la sección que desea enmascarar. Haga clic en el canal alfa y complete el área de selección con negro. Invierta la selección, aún en el canal alfa, y llénela de blanco. Guarde y exporte el archivo .png como 24 bits con alfa (efectivamente 32 bit). Tu archivo debería mostrarse correctamente.

+4

es fácil crear una imagen de canal alfa, me preguntaba cómo usar este canal alfa como una máscara –

+1

@Erik No es una pregunta por cierto: D –

7

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

De lo contrario, la escala será incorrecta.

Aquí hay un código de ejemplo 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; 
    } 

    } 
+0

error de enlace 404 .. –

Cuestiones relacionadas