Android
PorterDuff-läge
Sök…
Introduktion
PorterDuff beskrivs som ett sätt att kombinera bilder som om de var "oregelbundna kartongbitar" överlagda på varandra, liksom ett schema för att blanda de överlappande delarna
Anmärkningar
"Porter Duff" i sig är en alfa-kompositionsteknik uppkallad efter ett papper av Thomas Porter och Tom Duff.
Sammanfattningsvis tar tekniken två bilder med en alfakanal och genererar utgångsbilden genom att kombinera pixelvärden för två bilder. De olika kombinationslägena resulterar i olika utgångsbilder. I följande bild kombineras till exempel blå form (källa, befintliga pixlar) med gul form (destination, nya pixlar) i olika lägen:
Skapa en PorterDuff ColorFilter
PorterDuff.Mode
används för att skapa ett PorterDuffColorFilter
. Ett färgfilter modifierar färgen på varje pixel i en visuell resurs.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Ovanstående filter tonar de icke transparenta pixlarna till blå färg.
Färgfiltret kan appliceras på en Drawable
:
drawable.setColorFilter(filter);
Det kan tillämpas på en ImageView
:
imageView.setColorFilter(filter);
Dessutom kan det appliceras på ett Paint
, så att den färg som dras med hjälp av den färg, modifieras av filter:
paint.setColorFilter(filter);
Skapa en PorterDuff XferMode
En Xfermode
(tänk "överföring" -läge) fungerar som ett överföringssteg i ritningsrörledningen. När en Xfermode
appliceras på en Paint
, är pixlarna dragna med färgen kombineras med underliggande pixlar (redan dragen) enligt det läge:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Nu har vi en blå färg. Alla ritade former tonas de redan befintliga, icke transparenta pixlarna blå i formens område.
Applicera en radiell mask (vignett) på en bitmapp med 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);
}