Android查看动画和硬件图层

时间:2012-09-04 22:17:38

标签: android animation hardware-acceleration

我目前正在尝试制作动画视图时如何正确使用hardware layers

我正在实现一个ViewGroup,它允许用户拖动子视图,之后我将它设置为释放时的位置(就像ViewPager将如何在页面上定位一样)。 This文章指出,您应该只在动画期间启用硬件图层。

我遇到的问题是,在启用硬件层后,Android必须创建层,在Galaxy Nexus上需要70-100ms。这意味着我无法在开始动画之前立即执行此操作,因为拖动和动画之间的延迟会非常明显。出于同样的原因,我也无法在启动拖动时启用它。

现在,这个延迟仅在第一次创建硬件层时出现,所以理想情况下,我希望在将视图添加到布局后立即创建它们。我被指向View.buildLayer(),但我不确定如何处理这个问题。

  • 实现这一目标的正确方法是什么?
  • 我的ViewGroup中是否有任何方法可以覆盖并在子视图上调用buildLayer()?
  • 硬件层能否以某种方式失效,导致另外70-100ms的延迟?我该如何处理?

1 个答案:

答案 0 :(得分:13)

当缓存中没有图层时,会发生延迟,您不应该看到后续调用setLayerType(NONE)/ setLayerType(HARDWARE)的延迟。您可以从onSizeChanged()调用buildLayer()来强制构建一个图层,然后放入缓存中(调用setLayerType(NONE)将图层移动到缓存中。)

请注意,您看到的延迟在很大程度上取决于您所使用的设备。

您不应该启用图层的原因是每次视图更新时它都会使绘图工作量增加一倍。例如,如果将ListView移动到图层然后滚动列表,则滚动动画期间的每个帧更新将导致:(a)要重新绘制到图层的列表(b)要在屏幕上绘制的图层。这非常浪费,可能会导致性能问题,具体取决于UI的复杂程度。