Android
PorterDuff-Modus
Suche…
Einführung
PorterDuff wird als eine Möglichkeit beschrieben, Bilder so zu kombinieren, als wären sie "unregelmäßig geformte Kartonstücke", die übereinander angeordnet sind, sowie ein Schema zum Mischen der überlappenden Teile
Bemerkungen
"Porter Duff" an sich ist eine Alpha-Compositing-Technik, benannt nach einem Artikel von Thomas Porter und Tom Duff.
Zusammenfassend nimmt die Technik zwei Bilder mit Alphakanal und erzeugt das Ausgabebild durch Kombinieren der Pixelwerte von zwei Bildern. Die verschiedenen Kombinationsmodi führen zu unterschiedlichen Ausgabebildern. Im folgenden Bild wird beispielsweise die blaue Form (Quelle, vorhandene Pixel) mit der gelben Form (Ziel, neue Pixel) in verschiedenen Modi kombiniert:
Erstellen eines PorterDuff ColorFilter
PorterDuff.Mode
wird zum Erstellen eines PorterDuffColorFilter
. Ein Farbfilter ändert die Farbe jedes Pixels einer visuellen Ressource.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Der obige Filter färbt die nicht transparenten Pixel blau ein.
Der Farbfilter kann auf ein Drawable
:
drawable.setColorFilter(filter);
Es kann auf eine ImageView
:
imageView.setColorFilter(filter);
Es kann auch auf eine Paint
angewendet werden, sodass die Farbe, die mit dieser Farbe gezeichnet wird, vom Filter geändert wird:
paint.setColorFilter(filter);
Erstellen eines PorterDuff-XferMode
Ein Xfermode
Modus (think "transfer" -Modus) dient als Übertragungsschritt beim Zeichnen der Pipeline. Wenn ein Xfermode
auf einen Paint
angewendet wird, werden die mit dem Paint gezeichneten Pixel mit darunter liegenden Pixeln (bereits gezeichnet) gemäß dem Modus kombiniert:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Jetzt haben wir eine blaue Tönungsfarbe. Jede gezeichnete Form färbt die bereits vorhandenen, nicht transparenten Pixel im Bereich der Form blau.
Wenden Sie eine radiale Maske (Vignette) mit PorterDuffXfermode auf eine Bitmap an
/**
* 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);
}