Я хотел бы лучше понять, как компоненты конвейера рисования Canvas в Android (2D) сочетаются друг с другом.
Например, как взаимодействуют XferMode, Shader, MaskFilter и ColorFilter? Справочные документы для этих классов довольно редки, и документы для Canvas и Paint на самом деле не добавляют никакого полезного объяснения.
Мне также не совсем понятно, как операции рисования, которые имеют внутренние цвета (например, drawBitmap
, а не "векторные" примитивы, такие как drawRect
), вписываются во все это - всегда ли они игнорируют цвет Paint
и используют вместо этого свой собственный цвет?
Я также был удивлен тем, что можно сделать что-то вроде этого:
Paint eraser = new Paint();
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawOval(rectF, eraser);
Это стирает овал. До того, как я это заметил, моей ментальной моделью было то, что рисование на холсте (концептуально) рисует в отдельный "слой", а затем этот слой состоит из растрового изображения холста с использованием режима переноса Paint. Если бы это было так просто, то вышеприведенный код стер бы всю битовую карту (в пределах области отсечения), так как CLEAR всегда устанавливает цвет (и альфа) в 0 независимо от исходного альфа. Таким образом, это подразумевает, что существует дополнительная разновидность маскирования, чтобы ограничить стирание овалом.
Я нашел демоверсии API, но каждая демоверсия работает "в вакууме" и не показывает, как то, на чем она фокусируется (например, XferModes), взаимодействует с другими вещами (например, ColorFilters).
С достаточным количеством времени и усилий я мог бы эмпирически выяснить, как эти части связаны или расшифровывают источник, но я надеюсь, что кто-то еще уже разработал это, или еще лучше, что есть некоторая фактическая документация модели конвейера/чертежа, которая Я пропустил.
Этот вопрос был вдохновлен, увидев код в этом ответе на другой вопрос SO.
Обновить
Когда я искал какую-то документацию, мне пришло в голову, что, поскольку многие вещи, которые меня интересуют здесь, кажутся довольно тонким шпоном поверх skia, возможно, есть некоторая документация skia, которая будет полезна. Лучшее, что я могу найти, - это документация для SkPaint
которой говорится:
Существует 6 типов эффектов, которые можно назначить краске:
- SkPathEffect - изменение геометрии (пути) до того, как она сгенерирует альфа-маску (например, штрих)
- SkRasterizer - создание пользовательских слоев маски (например, теней)
- SkMaskFilter - изменение альфа-маски до ее раскрашивания и рисования (например, размытие, тиснение)
- SkShader - например, градиенты (линейный, радиальный, развертка), растровые шаблоны (зажим, повтор, зеркальное отображение)
- SkColorFilter - изменить исходные цвета перед применением xfermode (например, цветовой матрицы)
- SkXfermode - например, режимы переноса портера, режимы наложения
Это не указано явно, но я предполагаю, что порядок эффектов здесь - это порядок, в котором они появляются в конвейере.