Android
Modalità PorterDuff
Ricerca…
introduzione
PorterDuff è descritto come un modo di combinare le immagini come se fossero "pezzi di cartone di forma irregolare" sovrapposti l'uno sull'altro, nonché uno schema per miscelare le parti sovrapposte
Osservazioni
"Porter Duff" in sé è una tecnica di compositing alfa che prende il nome da un articolo di Thomas Porter e Tom Duff.
Per riassumere, la tecnica prende due immagini con canale alfa e genera l'immagine di output combinando i valori dei pixel di due immagini. Le varie modalità di combinazione producono immagini di output differenti. Ad esempio, nell'immagine seguente, la forma blu (origine, pixel esistenti) viene combinata con la forma gialla (destinazione, nuovi pixel) in diverse modalità:
Creazione di un filtro colorato PorterDuff
PorterDuff.Mode
viene utilizzato per creare un PorterDuffColorFilter
. Un filtro colore modifica il colore di ciascun pixel di una risorsa visiva.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Il filtro precedente colorerà i pixel non trasparenti con il colore blu.
Il filtro colore può essere applicato a un Drawable
:
drawable.setColorFilter(filter);
Può essere applicato a un ImageView
:
imageView.setColorFilter(filter);
Inoltre, può essere applicato a un Paint
, in modo che il colore che viene disegnato usando quella vernice, venga modificato dal filtro:
paint.setColorFilter(filter);
Creazione di un XferMode PorterDuff
Un Xfermode
(si pensi alla modalità "trasferimento") funziona come una fase di trasferimento nella pipeline di disegno. Quando un Xfermode
viene applicato a un Paint
, i pixel disegnati con la vernice vengono combinati con i pixel sottostanti (già disegnati) secondo la modalità:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Ora abbiamo una tinta blu. Qualsiasi forma disegnata colorerà i pixel già esistenti non trasparenti nell'area della forma.
Applicare una maschera radiale (vignetta) a una bitmap utilizzando PorterDuffXfermode
/**
* Apply a radial mask (vignette, i.e. fading to black at the borders) to a bitmap
* @param imageToApplyMaskTo Bitmap to modify
*/
public static void radialMask(final Bitmap imageToApplyMaskTo) {
Canvas canvas = new Canvas(imageToApplyMaskTo);
final float centerX = imageToApplyMaskTo.getWidth() * 0.5f;
final float centerY = imageToApplyMaskTo.getHeight() * 0.5f;
final float radius = imageToApplyMaskTo.getHeight() * 0.7f;
RadialGradient gradient = new RadialGradient(centerX, centerY, radius,
0x00000000, 0xFF000000, android.graphics.Shader.TileMode.CLAMP);
Paint p = new Paint();
p.setShader(gradient);
p.setColor(0xFF000000);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
canvas.drawRect(0, 0, imageToApplyMaskTo.getWidth(), imageToApplyMaskTo.getHeight(), p);
}