2

我是 android java 中的图形新手。我遇到过Canvas.saveLayer(...) Canvas.restore(...),这些操作的有用性(就性能而言)完全让我无法理解。图层是否因此在随后的 lockCanvas ~ unlockCanvasAndPost周期中保存?或者,为每一帧保存和恢复“缓冲位图”有什么意义?

有些人还提到使用这些图层来制作 alpha 动画(重新合成???),但我似乎也没有找到一个明确的例子来说明如何做到这一点......

或者

我在这里完全和绝对地吠叫错误的树吗?

4

1 回答 1

2

Canvas.saveLayer 允许您将渲染重新定位到屏幕外缓冲区。缓冲区可以是位图或 GPU 纹理,具体取决于您如何设置视图的图层类型 - 软件或硬件渲染(即 LAYER_TYPE_SOFTWARE 或 LAYER_TYPE_HARDWARE,请参阅

当您调用相应的 restoreToCount 时,此缓冲区会合成到上一个目标中。因此,这允许您进行各种视觉效果,如淡入淡出(即 alpha 动画)。

理想情况下,您希望使用硬件层来制作 alpha 动画,因为 alpha 可以是硬件加速的。

您很少直接调用 canvas.setLayer 来设置或设置 alpha 动画。您要么使用 view.setAlpha,要么使用动画然后使用 view.animate().alpha(0),两者在内部最终都会在画布上调用 setAlphaLayer。

因此,您唯一要做的就是确保在开始 alpha 动画之前将层类型设置为 View.LAYER_TYPE_HARDWARE(如果设备支持,否则软件层通过 LAYER_TYPE_SOFTWARE),然后在动画结束时将其删除。

在 4.0 中,您可以执行以下操作:

view.setLayerType(LAYER_TYPE_HARDWARE, null);
view.animate().alpha(0).setListener (new AnimationListener() {
             public void onAnimationEnd (Animator animation) {
                   view.setLayerType(LAYER_TYPE_NONE, null);
             }
});

在 4.1 中,这被简化为: view.animate().alpha(0).withLayer();

于 2013-01-06T04:41:19.043 回答