Мне бы хотелось лучше понять, как компоненты конвейера рисования 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 - например, режимы переноса портера, режимы наложения
Не указано явно,но я предполагаю, что порядок эффектов здесь - это порядок их появления в конвейере.