Fab*_*ndl 10 performance layout android
我有一个非常复杂的android应用程序.尽可能扁平化视图层次结构,但我仍然在应用程序中滞后.例如,有一个菜单,其条目通过将其高度设置为a来折叠/展开ValueAnimator
.通常,动画在第一次运行时会有一点滞后,并且在第一次通过后会平滑.
我注意到,当我在菜单项上调用"requestLayout()"时,Android似乎会执行布局传递和多次测量 - 遍历整个层次结构.
这是我正在做的动画的草图:
我不确定为什么动画中会触发布局,但我会抽象地回答你的问题.
如果您在动画中调用requestLayout(直接或间接),则表示错误.
requestLayout,为了正确性和安全性,在视图层次结构上执行完整视图遍历b/c概念上更改视图层次结构中节点的边界框可能导致任何其他节点的边界发生更改.并非总是如此,但总的来说它可能,这就是为什么requestLayout是一个完整的遍历.
所有这些只是另一种说法,即requestLayout将从你的16.6毫秒帧时间消耗时间并使你的动画不稳定.这对于具有许多RelativeLayouts的深层和复杂层次结构尤其糟糕,这些层次结构在内部每层执行两次传递(因此可能导致子树上的指数传递)
现在,如果要在维度中更改动画,请在硬件层中使用setScale.并在动画结束时快乐地调用requestlayout并破坏图层(以释放内存).
因为它是一个图层,在动画中重复调用setScale会导致GPU上的纹理发生变化,从而完全绕过视图层次结构的遍历机制.这应该使它变得柔和.
你的问题看起来像我的:只有重新布局的孩子,而不是所有的树
首先,您可以尝试避免视图的复杂视图层次结构。如果可能,将视图分解为不依赖于另一视图的视图。
执行动画时,避免任何布局请求。如果布局请求待处理,则延迟启动动画。
如果可能的话,使用硬件层进行动画(也许 Android 默认使用它ValueAnimator
)
归档时间: |
|
查看次数: |
4911 次 |
最近记录: |