我希望saveLayer方法将允许我在不同的“图层”上进行绘制,然后一旦绘制完成,就可以按照我选择的顺序将图层与 Canvas 合并。

显而易见的问题是“为什么不重新布置绘图操作呢?”答案是我不能:

我有一个需要在 Canvas 上绘制的路径。在背景/最低的z-index中,我想使用填充样式绘制闭合的路径并添加一些其他点。然后,最重要的是,我只想绘制路径中最初的点的轮廓。

由于无法撤消在路径上添加点的操作,因此,我唯一的选择是克隆路径,或绘制到第二层,然后再将其放置在其他所有层之上。

saveLayer()似乎提供了该功能,但没有达到我期望的方式。我的操作的基本流程是这样的:

int overlay = canvas.saveLayer(...);
// drawing operations for my uppermost layer
...

int background = canvas.saveLayer(...);
// drawing operations for my background layer
...

// merge the offscreen background bitmap with the canvas:
canvas.restoreToCount(background);

// merge the offscreen overlay bitmap with the canvas:
canvas.restoreToCount(overlay);

代码运行时,背景和覆盖层的顺序完全没有改变。首先绘制的是底部,最后绘制的是顶部。对我来说甚至更陌生的是,我可以完全注释掉对restoreToCount()的调用,并且什么都没有改变。根据javadoc,在调用平衡的restore()之前,不应在 Canvas 上绘制任何内容。

显然我完全误解了这种方法的功能。有人可以帮助我了解saveLayer的用法,或者建议使用另一种方法来对我的绘图操作进行分层吗?

谢谢!
缺口

最佳答案

saveLayer()不允许您以随机顺序重新排列图层。唯一的方法是自己绘制屏幕外的位图。还要注意, View 的父级将在onDraw()调用周围调用save()/restore(),这将导致您的图层被合成。

10-08 07:55