Android视图animation和硬件层

我正在试图解决如何在animation视图时正确使用硬件层 。

我正在实现一个ViewGroup,使用户能够拖动一个子视图,然后在释放的时候将其设置为一个位置(比如ViewPager如何定位在一个页面上)。 本文指出,您应该只在animation期间启用硬件层。

我遇到的问题是,硬件层启用后,Android必须创build的图层,这需要70-100毫秒的Galaxy Nexus。 这意味着我不能马上做animation,因​​为拖动和animation之间的延迟是非常明显的。 出于同样的原因,我也无法启动拖动。

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

  • 什么才是实现这一目标的正确方法?
  • 有没有我的ViewGroup中的任何方法,我可以重写和调用子视图上的buildLayer()?
  • 硬件层能否以某种方式失效,造成另外70-100毫秒的延迟? 我该如何处理呢?

Solutions Collecting From Web of "Android视图animation和硬件层"

延迟发生在caching中没有图层的时候,你不应该在随后调用setLayerType(NONE)/ setLayerType(HARDWARE)的时候看到延迟。 您可以从onSizeChanged()调用buildLayer()来强制一个图层被build立,然后放入caching(调用setLayerType(NONE)来移动图层到caching。)

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

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