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

Nic*_*ick 10 java graphics android 2d canvas

我希望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);
Run Code Online (Sandbox Code Playgroud)

当代码运行时,背景和叠加的顺序根本没有改变; 首先绘制的是底部,最后绘制的是最重要的.对我来说更奇怪的是,我可以完全注释掉两个调用restoreToCount()并且没有任何变化.根据javadoc,在调用balance()之前,不应该向画布绘制任何内容.

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

谢谢!缺口

Rom*_*Guy 9

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