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

标签 java android graphics canvas 2d

我希望 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);

代码运行时,background 和 overlay 的顺序完全没有变化;首先绘制的在底部,最后绘制的在顶部。对我来说更奇怪的是,我可以完全注释掉对 restoreToCount() 的调用并且没有任何变化。根据 javadoc,在调用平衡 restore() 之前,不应在 Canvas 上绘制任何内容。

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

谢谢! 尼克

最佳答案

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

关于java - 了解 Android 的 Canvas.saveLayer(...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5121302/

相关文章:

java - Swing:保存当前图形

r - 如何在 R 中创建边际效应表?

java - PHP 和 Android 上的椭圆曲线密码学

android - 来自 Fragment 的 DialogFrag#show() 抛出 "IllegalStateException: Can not perform this action after onSaveInstanceState"

java - 向 java 构造函数与方法发送参数

java - 如何在 UNIX 目录中的每个文件上运行 Java 程序?

java - 在线性布局中将 TextView 置于 ImageView 正下方

Java简单的绘画代码不起作用

java - 为什么我在启动简单代码(JavaFX)时遇到问题?

java - 在 spring mvc Controller 中使用服务和 DAO