Как части конвейера рисования Canvas (2D) в Android сочетаются друг с другом?

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

Это не указано явно, но я предполагаю, что порядок эффектов здесь - это порядок их появления в конвейере.

60
задан Community 23 May 2017 в 11:46
поделиться