例如,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的传输模式将该层与Canvas的位图组合。如果事情就那么简单,那么上面的代码将擦除整个位图(在剪辑区域内),因为CLEAR始终将颜色(和alpha)设置为0,而不管源的alpha如何。因此,这意味着还有另一种额外的掩蔽来限制擦除为椭圆形。
我确实找到了API演示,但每个演示都是“真空”中工作的,并没有展示它关注的东西(例如:XferModes)如何与其他内容(例如:ColorFilters)交互。
如果有足够的时间和精力,我可以通过经验法则弄清楚这些部分之间的关系或解密源代码,但我希望有人已经解决了这个问题,或者更好的是,我错过了某些实际的管道/绘图模型的文档。
这个问题的灵感来自于看到这个对另一个SO问题的答案中的代码。
更新
在寻找一些文档时,我想到由于我感兴趣的大部分内容似乎都是skia上覆盖的一个薄薄的表层,也许有一些skia文档会很有帮助。我能找到的最好的东西是SkPaint
的文档,其中写道:
有6种类型的效果可以分配给画笔:
- SkPathEffect-在生成 alpha mask 之前对几何图形(路径)进行修改(例如虚线)
- SkRasterizer - 组合自定义遮罩层(例如阴影)
- SkMaskFilter - 在对 alpha mask 进行着色和绘制之前对其进行修改(例如模糊,浮雕)
- SkShader-例如渐变(线性,径向,扫描),位图模式(clamp,repeat,mirror)
- SkColorFilter-在应用xfermode之前修改源颜色
- SkXfermode-例如porter-duff传输模式,混合模式
虽然没有明确说明,但我猜这里的效果顺序是它们出现在管道中的顺序。
clear(src, dst) = [0,0]
的应用。 - Laurence Gonsalves