是否可以为 RecyclerView 高度设置动画,或者以其他方式以编程方式更改它?例如,如果我有一个有时可见的大标题 View ,有时则不可见 - 我想在标题动画显示时为 RecyclerView 高度设置动画以填充屏幕。
更改 LayoutParams.height 似乎不起作用。 LinearLayout animateLayoutChanges 导致崩溃。
<LinearLayout>
<RelativeLayout (header)>
<RecyclerView>
</LinearLayout>
我想让 RelativeLayout 动画出顶部(translationY),然后同时让 recyclerview 动画更高以适合。
最佳答案
有可能的选择来解决这个问题:
按照@Ari 的建议开始动画,并在每个动画更新布局参数。这将影响 recyclerview 改变它的大小。然而,从性能的角度来看,这是一个可怕的想法。 Layout and Measure 过程非常昂贵,因此通常您希望尽量减少触发布局的调用。调用
setLayoutParams
将触发 RecyclerView 及其所有子项的布局和测量过程,这意味着在每一帧上你都将做非常昂贵的工作,这很可能会导致 framedrop 和糟糕的用户体验还有另一种方法。它可能并非在所有情况下都有效——这完全取决于您的最终布局,但这仍然是我推荐的做法。这个想法 - 是在开始动画之前让你的 recyclerView 更高。不过,它需要一些高级 Android 技能。基本上,您需要覆盖 RecyclerView 中的
onMeasure
和layout
方法(您实际上需要扩展 RecyclerView 类才能做到这一点)。- 你可以在你的 recyclerView 中引入一些标志来衡量自己比正常情况高一点(高多少 - 你的标题 View 的确切高度)
- 当您需要动画标题时 - 将您的标志设置为
true
并请求新布局。这将重新布局 recyclerView,底部有一些不可见的部分。 - 现在您可以为 RecyclerView 和 Header 的 y 翻译设置动画,这样标题就会移出屏幕,recyclerview 就会变得更高。这会让用户觉得 recyclerview“扩展”了
- 一旦动画完成 - 将您的自定义标志设置为
false
并将标题的可见性更改为GONE
因为它现在不在屏幕上
以下是关于实现自定义 onMeasure
逻辑的一些信息:
https://medium.com/android-news/perfmatters-introduction-to-custom-viewgroups-to-improve-performance-part-2-f14fbcd47c
关于android - 动画 RecyclerView 高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32876892/