【问题标题】:Android view animation and hardware layersAndroid 视图动画和硬件层
【发布时间】:2012-08-29 14:54:47
【问题描述】:

我目前正在研究如何在动画视图时正确使用hardware layers

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

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

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

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

【问题讨论】:

标签: android animation hardware-acceleration


【解决方案1】:

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

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

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

【讨论】:

  • 好吧,我可能庆祝得早了一点。我不小心把它留在了硬件上。我可以看到它在 onSizeChanged() 之后创建了层,通常需要 70+ms。然而,当我第一次切换到硬件时,当我需要动画时,也会发生同样的事情。
  • 为了清楚起见,我得到了两次大延迟。一次是我从 onSizeChanged() 构建Layer() 时,一次是我第一次为视图设置动画。之后,就没有延迟了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多