Android
Режим PorterDuff
Поиск…
Вступление
PorterDuff описывается как способ комбинирования изображений, как если бы они были «фигурами неправильной формы картона», наложенными друг на друга, а также схемой смешивания перекрывающихся частей
замечания
«Портер Дафф» сам по себе является альфа-композиционной техникой, названной в честь работы Томаса Портера и Тома Даффа.
Подводя итог, техника берет два изображения с альфа-каналом и генерирует выходное изображение, комбинируя значения пикселей двух изображений. Различные режимы комбинирования приводят к разному выходному изображению. Например, на следующем изображении синяя форма (источник, существующие пиксели) объединяется с желтой формой (назначение, новые пиксели) в разных режимах:
Создание фильтра PorterDuff ColorFilter
PorterDuff.Mode
используется для создания PorterDuffColorFilter
. Цветовой фильтр изменяет цвет каждого пикселя визуального ресурса.
ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);
Вышеуказанный фильтр будет оттенять непрозрачные пиксели до синего цвета.
Цветовой фильтр можно применить к Drawable
:
drawable.setColorFilter(filter);
Его можно применять к ImageView
:
imageView.setColorFilter(filter);
Кроме того, он может быть применен к Paint
, так что цвет, который рисуется с использованием этой краски, изменяется фильтром:
paint.setColorFilter(filter);
Создание PorterDuff XferMode
Xfermode
(думаю, «передача») работает как шаг передачи в чертежном конвейере. Когда Xfermode
применяется к Paint
, пиксели, нарисованные краской, объединяются с базовыми пикселями (уже нарисованными) в соответствии с режимом:
paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
Теперь у нас есть синяя краска. Любая обрамленная фигура будет оттенять уже существующие, непрозрачные синие пиксели в области формы.
Примените радиальную маску (виньетку) к растровому изображению, используя 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);
}