了解Android的Canvas.saveLayer(...)

时间:2011-02-25 18:46:23

标签: java android graphics canvas 2d

我希望saveLayer方法允许我绘制到不同的“图层”上,然后在绘图完成后,按照我选择的顺序将图层与画布合并。

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

我有一个需要绘制到画布上的路径。在背景/最低z-index中,我想使用填充样式绘制封闭的路径并使用一些额外的点。然后,最重要的是,我想绘制一个最初在路径中的点的轮廓。

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

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()之前,不应该向画布绘制任何内容。

显然我完全误解了这种方法的功能。任何人都可以帮我理解saveLayer的用法,或者建议另一种方法来分层我的绘图操作吗?

THX! 尼克

1 个答案:

答案 0 :(得分:9)

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