Je voudrais avoir une meilleure compréhension de la façon dont les composants de Android (2D) en Toile de dessin pipeline de l'ajustement ensemble.
Comment, par exemple, XferMode, Shader, MaskFilter et ColorFilter interagir? La référence docs pour ces classes sont assez rares et les docs pour la Toile et de la Peinture n'a pas vraiment d'ajouter toute explication utile.
Il n'est également pas tout à fait clair pour moi comment les opérations de dessin qui ont des couleurs intrinsèques (par exemple: drawBitmap
, par rapport à la "vecteur" primitives comme drawRect
) dans tout cela -- ont-ils toujours ignorer l' Paint
's de couleur et utiliser leur couleur intrinsèque à la place?
J'ai également été surpris par le fait que l'on peut faire quelque chose comme ceci:
Paint eraser = new Paint();
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawOval(rectF, eraser);
Cela efface la forme d'un ovale. Avant que j'ai remarqué c'est mon mental-modèle est que le dessin d'une toile (conceptuellement) aspire à une autre "couche" et puis, cette couche est composée de la Toile Bitmap à l'aide de la Peinture du mode de transfert. Si c'était aussi simple que ça, alors le code ci-dessus serait effacer l'image entière (dans le région de coupure) CLAIR comme toujours définit la couleur (et alpha) à 0 quelle que soit la source de l'alpha. Donc, cela implique qu'il ya un supplément de tri de masquage de passe pour limiter l'effacement d'un ovale.
Je n'ai trouver l' API démos mais chaque démonstration fonctionne "dans le vide" et ne montre pas comment la chose qu'elle met l'accent sur (par exemple: XferModes) interagit avec d'autres trucs (par exemple: ColorFilters).
Avec suffisamment de temps et d'efforts j'ai pu empiriquement à comprendre comment ces pièces se rapportent ou aller déchiffrer la source, mais je suis en espérant que quelqu'un d'autre a déjà travaillé, ou mieux encore qu'il y a une réelle documentation de la canalisation et le dessin-modèle que j'ai manqué.
Cette question a été inspiré par voir le code dans cette réponse à l'autre question.
Mise à jour
Tout en regardant autour pour certains documents, il m'est apparu que depuis beaucoup de choses que je suis intéressé par ici semble être un peu de vernis sur le dessus de skia, peut-être, il y a quelques skia de la documentation qui pourrait être utile. La meilleure chose que j'ai pu trouver est la documentation pour SkPaint
qui dit:
Il existe 6 types d'effets qui peuvent être attribué à une peinture:
- SkPathEffect - des modifications de la géométrie (chemin) avant qu'il ne génère un masque alpha (par exemple, fringant)
- SkRasterizer - composant personnalisé calques de masque (comme par exemple des ombres)
- SkMaskFilter - modifications pour le masque alpha avant il est colorisée et (par exemple flou, relief)
- SkShader - par exemple, des gradients (linéaire, radial, balayage), modèles bitmap (pince, répéter, miroir)
- SkColorFilter - modifier la couleur source(s) avant l'application de l'xfermode (ex: la couleur de la matrice)
- SkXfermode - par exemple, porter-duff transfermodes, les modes de fusion
Il n'est pas dit explicitement, mais je devine que l'ordre des effets voici l'ordre qu'ils apparaissent dans le pipeline.