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