10

我有一个非常复杂的 android 应用程序。已经尽可能扁平化视图层次结构,但我仍然在应用程序中存在滞后。例如,有一个菜单,其中的条目通过设置高度来折叠/展开ValueAnimator。通常,动画第一次运行时会有一点延迟,而在第一次运行后则平滑。

我注意到,当我在 Menu-Item 上调用“requestLayout()”时,Android 似乎在整个层次结构中进行了布局传递和多个测量传递。

  • 因为我知道虽然 Menu-Item(View) 改变了高度,但 Menu(View) 本身没有,有没有办法告诉应用程序?
  • 我能否以某种方式执行似乎滞后于自己的第一次通过,以便它发生在应用程序启动之后而不是在第一次触摸输入时?

这是我正在做的动画的草图:

在此处输入图像描述

4

2 回答 2

6

我不确定为什么在您的动画中触发布局,但我将抽象地回答您的问题。

如果您在动画中调用 requestLayout(直接或间接),那么您做错了。

requestLayout,为了正确性和安全性,在视图层次结构上进行完整的视图遍历 b/c 从概念上改变视图层次结构中节点的边界框可能会导致任何其他节点的边界发生变化。并非总是如此,但通常它可以,这就是为什么 requestLayout 是一个完整的遍历。

所有这一切只是另一种说法 requestLayout 会从你的 16.6 毫秒帧时间槽中消耗掉时间并使你的动画变得不稳定。这对于具有许多RelativeLayouts的深层和复杂层次结构尤其不利,这些结构在每个级别内部进行两次传递(因此可能导致子树上的指数传递)

现在,如果您想在尺寸变化中设置动画,请在硬件层中使用 setScale。并在动画结束时愉快地调用 requestlayout 并销毁图层(以释放内存)。

因为它是一个层,所以在动画中重复调用 setScale 会导致 GPU 上的纹理发生变化,从而完全绕过视图层次结构的遍历机制。这应该使它像黄油一样光滑。

于 2013-06-18T23:09:43.270 回答
0

你的问题看起来像我的:只重新布置孩子而不是所有的树

首先,您可以尝试避免视图的复杂视图层次结构。如果可能,请分解不依赖于另一个视图的视图。

执行动画时,请避免任何布局请求。如果布局请求未决,请延迟开始动画。

如果可能的话,使用硬件层来制作动画(也许 Android 默认使用它ValueAnimator

于 2013-03-14T09:31:40.380 回答