15

我目前正在尝试研究如何在动画视图时正确使用硬件层。

我正在实现一个 ViewGroup ,它使用户能够拖动一个子视图,之后我将其动画到他们释放时的某个位置(就像 ViewPager 将如何安置在页面上一样)。本文指出,您应该只在动画期间启用硬件层。

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

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

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

1 回答 1

13

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

请注意,您看到的延迟很大程度上取决于您运行的设备。

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

于 2012-09-04T22:36:03.570 回答