android - 动画 RecyclerView 高度

标签 android animation android-recyclerview

是否可以为 RecyclerView 高度设置动画,或者以其他方式以编程方式更改它?例如,如果我有一个有时可见的大标题 View ,有时则不可见 - 我想在标题动画显示时为 RecyclerView 高度设置动画以填充屏幕。

更改 LayoutParams.height 似乎不起作用。 LinearLayout animateLayoutChanges 导致崩溃。

<LinearLayout>
   <RelativeLayout (header)>
   <RecyclerView>
</LinearLayout>

我想让 RelativeLayout 动画出顶部(translationY),然后同时让 recyclerview 动画更高以适合。

最佳答案

有可能的选择来解决这个问题:

  1. 按照@Ari 的建议开始动画,并在每个动画更新布局参数。这将影响 recyclerview 改变它的大小。然而,从性能的角度来看,这是一个可怕的想法。 Layout and Measure 过程非常昂贵,因此通常您希望尽量减少触发布局的调用。调用 setLayoutParams 将触发 RecyclerView 及其所有子项的布局和测量过程,这意味着在每一帧上你都将做非常昂贵的工作,这很可能会导致 framedrop 和糟糕的用户体验

  2. 还有另一种方法。它可能并非在所有情况下都有效——这完全取决于您的最终布局,但这仍然是我推荐的做法。这个想法 - 是在开始动画之前让你的 recyclerView 更高。不过,它需要一些高级 Android 技能。基本上,您需要覆盖 RecyclerView 中的 onMeasurelayout 方法(您实际上需要扩展 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/

相关文章:

css - 在图像上使用 CSS 对 MouseOver 的悬停效果

ios - MKMapView 淡入但不会通过动画淡出

java - 在 JavaFX 2 中实现逐步动画

java - LinearLayout 中的 RecyclerView 布局未刷新

android - Flutter 默认启动 View 淡入淡出动画

android - 在 frgamentActivity oncreate() 上检查 savedinstancestate 的原因

android - Couchbase 精简版 : reading document vs querying data

android - 如何修复 InstantiationException,无法实例化 Fragment?

java - BottomNavigationView 与 RecycleView 的最后一项重叠

android - 滑动以关闭 RecyclerView