2010-03-31 2 views
7

Я только начинаю с разработки Android, и я исхожу из мира JavaScript/HTML, поэтому сейчас изучаю возможности Android SDK.Композитные операции в Android Canvas

Холст HTML 5 поддерживает составные операции (см. here).

Возможно ли это на Android Canvas? Я просмотрел API класса Canvas, но не смог найти ничего полезного. Мне нужна, по крайней мере, составная операция «source-in» или (если это невозможно) «source-atop».

ответ

8

Композицию обрабатывают путем нанесения на Canvas с помощью Paint, который использует PorterDuffXfermode.

Paint p=new Paint(); 
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
canvas.drawBitmap(bitmap, 0, 0, p); 

См. here для получения дополнительной информации. Мне также удалось переопределить onPaint, чтобы мы могли применить эту композицию к элементам, которые рисуют темы.

1

Я раньше не занимался этими операциями, но думаю, что есть способ сделать их, используя форму Rect. Вы можете определить прямоугольники, чтобы отметить, какие области должны быть втянуты в холст или которые вынимаются из исходного изображения, а класс Rect имеет встроенные встроенные функции сравнения. Например, чтобы имитировать исходный код, вы можете использовать setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination), чтобы ваш новый прямоугольник имел только пересеченную область двух изображений. Затем вы можете использовать этот прямоугольник в качестве аргумента в одной из команд рисования холста, говоря ему, чтобы взять пиксели только из исходного изображения, находящегося внутри этого прямоугольника. Затем вы управляете рисунком по оси Z порядком, в котором выполняются команды рисования.

+0

Простой отсечения с прямоугольниками недостаточно. Мне нужны сложные альфа-маски. – kayahr

+0

Я просто собирал два примера изображений, показанных в вашей ссылке. Примеры из источника и источника на вершине не отображались в альфа-маскировке. Если это то, что вам нужно, я не знаю, как это сделать. Холсты поддерживают прозрачность между «слоями» изображений, нарисованных друг над другом, если у изображений уже есть встроенная прозрачность, но кто-то более опытный должен будет рассказать нам, возможно ли автоматическое смешивание. –

1

Обнаружил это сам. PorterDuffXfermode реализует все эти сложные режимы.