2011-12-25 11 views
30

Una domanda newbieAndroid - È possibile dichiarare una maschera alfa direttamente all'interno della definizione XML dell'elenco layer?

Ho questo layers.xml che uso come sorgente per un ImageView. E due immagini, mask.png e 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"/> 

Al momento l'uscita è proprio il png sull'immagine. Vorrei il png di agire come una maschera, ritaglio l'immagine utilizzando il canale alfa PNG in questo modo: enter image description here

È quello possibile direttamente all'interno del xml, o devo farlo per codice?

Grazie per i vostri consigli;)

aggiornamento: al momento in cui ho raggiunto il mio obiettivo utilizzando il codice di sostituire l'intero 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

è stato un bel modo di indicarmi qui! Non sono sicuro di questo, ma fammi guardare un po 'in giro e tornare da te. – Shaunak

+2

Devi metterlo come una risposta accettata perché questo mi ha appena salvato! – DeeV

+0

La risposta data non risponde alla domanda originale, mi sto ancora chiedendo se un livello maschera possa essere dichiarato usando la lista di livelli xml –

risposta

-3

.png file possono avere un canale alfa inclusa quando si crea li e Android può usarlo per isolare l'immagine mentre spieghi.

Creare un canale aggiuntivo in GIMP o Photoshop o qualsiasi altro editor di immagini che si utilizza. Questo sarà un canale monocromatico (256 sfumature di bianco in nero). Fai una selezione della sezione che vuoi mascherare OUT fai clic sul canale alfa e riempi l'area di selezione con il nero. Inverti la selezione, sempre nel canale alfa, e riempila di bianco. Salvare ed esportare il file .png come 24 bit con alfa (effettivamente 32 bit). Il tuo file dovrebbe essere visualizzato correttamente.

+4

è facile creare un'immagine di canale alfa, stavo chiedendo come usare questo canale alfa come maschera –

+1

@Erik Non è una domanda tra l'altro: D –

7

Inserire l'immagine della maschera nella cartella drawable-nodpi.

In caso contrario, il ridimensionamento sarà errato.

Ecco un esempio di codice da un'app. Dopo la fotocamera aggiunge una maschera.

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

errore link 404 .. –

Problemi correlati