Android
Tryb PorterDuff
Szukaj…
Wprowadzenie
PorterDuff jest opisany jako sposób łączenia obrazów tak, jakby były to „nieregularne kawałki kartonu” nałożone na siebie, a także schemat mieszania zachodzących na siebie części
Uwagi
„Porter Duff” sam w sobie jest techniką kompozytowania alfa nazwaną na cześć artykułu Thomasa Portera i Toma Duffa.
Podsumowując, technika wykonuje dwa obrazy z kanałem alfa i generuje obraz wyjściowy, łącząc wartości pikseli dwóch obrazów. Różne tryby łączenia dają różne obrazy wyjściowe. Na przykład na poniższym obrazku niebieski kształt (źródło, istniejące piksele) jest łączony z żółtym kształtem (miejsce docelowe, nowe piksele) w różnych trybach:
Tworzenie filtru kolorów PorterDuff
PorterDuff.Mode
służy do tworzenia PorterDuffColorFilter
. Filtr kolorów modyfikuje kolor każdego piksela zasobu wizualnego.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Powyższy filtr spowoduje odbarwienie nieprzezroczystych pikseli do koloru niebieskiego.
Filtr kolorów można zastosować do Drawable
:
drawable.setColorFilter(filter);
Można go zastosować do ImageView
:
imageView.setColorFilter(filter);
Można go również zastosować do Paint
, dzięki czemu kolor rysowany za pomocą tej farby jest modyfikowany przez filtr:
paint.setColorFilter(filter);
Tworzenie PorterDuff XferMode
Xfermode
(tryb „transferu”) działa jako krok transferu w rysowaniu potoku. Kiedy Xfermode
zostanie zastosowany do Paint
, piksele narysowane za pomocą farby są łączone z pikselami leżącymi poniżej (już narysowanymi) zgodnie z trybem:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Teraz mamy niebieską farbę. Każdy narysowany kształt zabarwi już istniejące, nieprzezroczyste piksele na niebiesko w obszarze kształtu.
Zastosuj maskę promieniową (winietę) do mapy bitowej za pomocą 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);
}