gpt4 book ai didi

android - 性能:如何防止 requestLayout() 布局整个层次结构

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:19 33 4
gpt4 key购买 nike

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

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

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

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

enter image description here

最佳答案

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

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

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

所有这些只是另一种说法,requestLayout 会占用 16.6 毫秒帧时隙的时间并使您的动画断断续续。这对于具有许多 RelativeLayouts 的深层和复杂层次结构尤其不利,RelativeLayouts 在内部每个级别执行两次传递(因此可能导致子树上的指数传递)

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

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

关于android - 性能:如何防止 requestLayout() 布局整个层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14624493/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com