Android
PorterDuff-modus
Zoeken…
Invoering
PorterDuff wordt beschreven als een manier om afbeeldingen te combineren alsof ze "onregelmatig gevormde stukjes karton" op elkaar zijn gelegd, evenals een schema voor het mengen van de overlappende delen
Opmerkingen
"Porter Duff" is op zichzelf een compositietechniek voor alfa's vernoemd naar een artikel van Thomas Porter en Tom Duff.
Om samen te vatten, de techniek neemt twee afbeeldingen met alfakanaal en genereert de uitvoerafbeelding door pixelwaarden van twee afbeeldingen te combineren. De verschillende combinatiemodi resulteren in verschillende uitvoerbeelden. In de volgende afbeelding wordt bijvoorbeeld de blauwe vorm (bron, bestaande pixels) gecombineerd met de gele vorm (bestemming, nieuwe pixels) in verschillende modi:
Een PorterDuff ColorFilter maken
PorterDuff.Mode
wordt gebruikt om een PorterDuffColorFilter
te maken. Een kleurenfilter wijzigt de kleur van elke pixel van een visuele bron.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Het bovenstaande filter kleurt de niet-transparante pixels in een blauwe kleur.
Het kleurenfilter kan worden toegepast op een Drawable
:
drawable.setColorFilter(filter);
Het kan worden toegepast op een ImageView
:
imageView.setColorFilter(filter);
Het kan ook op een Paint
worden toegepast, zodat de kleur die met die verf wordt getekend, door het filter wordt gewijzigd:
paint.setColorFilter(filter);
Een PorterDuff XferMode maken
Een Xfermode
(denk aan de "overdracht" -modus) werkt als een overdrachtsstap bij het tekenen van een pijplijn. Wanneer een Xfermode
op een Paint
wordt toegepast, worden de pixels die met de verf zijn getekend, gecombineerd met onderliggende pixels (al getekend) volgens de modus:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Nu hebben we een blauwe tint verf. Elke vorm die wordt getekend, kleurt de reeds bestaande, niet-transparante pixels blauw in het gebied van de vorm.
Pas een radiaal masker (vignet) toe op een bitmap met 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);
}