Android
Mode PorterDuff
Recherche…
Introduction
PorterDuff est décrit comme un moyen de combiner des images comme s'il s'agissait de «morceaux de carton de forme irrégulière» superposés les uns sur les autres, ainsi que d'un schéma de mélange des parties superposées.
Remarques
"Porter Duff" est en soi une technique de composition alpha nommée d'après un article de Thomas Porter et Tom Duff.
En résumé, la technique prend deux images avec un canal alpha et génère l'image de sortie en combinant les valeurs de pixels de deux images. Les différents modes de combinaison produisent une image de sortie différente. Par exemple, dans l'image suivante, la forme bleue (source, pixels existants) est combinée avec la forme jaune (destination, nouveaux pixels) dans différents modes:
Créer un filtre de couleur PorterDuff
PorterDuff.Mode
est utilisé pour créer un PorterDuffColorFilter
. Un filtre de couleur modifie la couleur de chaque pixel d'une ressource visuelle.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Le filtre ci-dessus colorera les pixels non transparents en couleur bleue.
Le filtre de couleur peut être appliqué à un Drawable
:
drawable.setColorFilter(filter);
Il peut être appliqué à un ImageView
:
imageView.setColorFilter(filter);
En outre, il peut être appliqué à une Paint
, de sorte que la couleur dessinée à l'aide de cette peinture soit modifiée par le filtre:
paint.setColorFilter(filter);
Créer un PorterDuff XferMode
Un Xfermode
(pensez au mode "transfer") fonctionne comme une étape de transfert dans le dessin du pipeline. Lorsqu'un Xfermode
est appliqué à une Paint
, les pixels dessinés avec la peinture sont combinés avec les pixels sous-jacents (déjà dessinés) selon le mode:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Maintenant, nous avons une peinture bleue. Toute forme dessinée colorera les pixels bleus déjà transparents existants dans la zone de la forme.
Appliquer un masque radial (vignette) à un bitmap à l'aide de 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);
}