Così ho provato il codice da qui: Creating an ImageView with a mask. Sto utilizzando le seguenti immagini come originale e la maschera:Android come applicare la maschera su ImageView?
Tuttavia, il risultato che ottengo è questo:
nota che lo sfondo della finestra non è nero, ma holo light (che sulla galaxy nexus ha l'aspetto di un grigio molto pallido, non completamente bianco). La seconda immagine è il risultato che ottengo quando un elemento è selezionato in una visualizzazione elenco.
Se invece creo un nuovo Bitmap utilizzando lo stesso algoritmo e poi passare alla visualizzazione dell'immagine, invece di rilevante OnDraw(), che disegna in modo corretto:
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
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(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
ottengo il risultato atteso:
Nota la dissolvenza è stata applicata correttamente. Questo è più evidente quando viene effettuata una selezione.
Quindi cosa succede nel metodo onDraw di ImageView per creare questo sfondo nero invece di lasciare trasparire lo sfondo della finestra? La cosa interessante è che, se l'immagine originale in sé ha una certa trasparenza, che la trasparenza è rispettato, per esempio:
non riesco a capirlo da solo. Preferirei farlo su onDraw invece di pre-creare la bitmap perché funziona solo per bitmap come sorgente e maschera. Voglio essere in grado di farlo con altri drawable come gradienti e colori solidi, ma in quei casi la larghezza e l'altezza non sono impostate.
Ecco un aggiornamento. Dopo aver letto http://stackoverflow.com/questions/3467334/erase-bitmap-parts-using-porterduff-mode, ho potuto riprodurre lo stesso comportamento del nero nell'esempio di lavoro se avessi impostato la configurazione di Bitmap su RGB_565 anziché su ARGB_8888. Potrei anche restringere il problema alla tela che viene passata sul metodo onDraw. Se utilizzo la tela onDraw, viene visualizzato il bordo nero.Dal momento che il canvas passato a onDraw non ha una bitmap associata, forse nativamente non supporta la trasparenza? Un'altra cosa che ho scoperto è che il bordo nero scompare mentre la vista elenco scorre. – AngraX
Ok. Dopo aver letto questo http://stackoverflow.com/questions/5231260/android-shader-behave-different-in-ondrawcanvas-and-new-canvasbitmap sembra che il bug sia in realtà che sto rendendo trasparenti i pixel della tela della finestra se lo applico sulla tela passato a onDraw(). E dietro la finestra c'è uno sfondo nero. Sembra che non abbia altra scelta che usare una bitmap temporanea e renderizzare in essa, a meno che non riesca a trovare un'altra modalità DST che funzioni. – AngraX
sto provando ad implementare una funzionalità simile in cui ho una visione di immagini con l'immagine e la seconda con maschera nera, al tocco dovrebbe mostrare la dietro immagine del cerchio come la tua presentazione, puoi aiutarmi qui? – ViVekH