Android 设置回收视图高度的动画

Android 设置回收视图高度的动画,android,animation,android-recyclerview,Android,Animation,Android Recyclerview,是否可以设置RecyclerView高度的动画,或者以编程方式对其进行更改?例如,如果我有一个大标题视图,有时可见,有时不可见,我希望在标题设置动画时设置RecyclerView高度的动画以填充屏幕 更改LayoutParams.height似乎不起作用。LinearLayout动画更改会导致崩溃 <LinearLayout> <RelativeLayout (header)> <RecyclerView> </LinearLayout>

是否可以设置RecyclerView高度的动画,或者以编程方式对其进行更改?例如,如果我有一个大标题视图,有时可见,有时不可见,我希望在标题设置动画时设置RecyclerView高度的动画以填充屏幕

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

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


我想让RelativeLayout动画化顶部(translationY),同时让recyclerview动画化,使其更高以适合自己。

有可能解决此问题的选项:

  • 按照@Ari的建议启动动画,并在每个动画上勾选更新布局参数。这将使recyclerview改变其大小。然而,从性能的角度来看,这是一个可怕的想法。布局和度量过程非常昂贵,所以通常您希望最小化触发布局的调用。调用
    setLayoutParams
    将触发RecycleView+所有子帧的布局和测量过程,这意味着在每一个帧上,您将执行非常昂贵的工作,这很可能会导致帧丢失和糟糕的用户体验

  • 不过,还有另一种方法。它可能不会在所有情况下都起作用——这完全取决于您的最终布局,但我还是建议您这样做。想法-是在开始动画之前让你的recyclerView更高。不过,它需要一些先进的Android技能。基本上,您需要覆盖RecyclerView中的
    onMeasure
    &
    layout
    方法(实际上需要扩展RecyclerView类来实现这一点)

    • 您可以在recyclerView中引入一些标志来测量自身是否比正常值高一点(多高-标题视图的确切高度)
    • 当您需要为标题设置动画时-将您的标志设置为
      true
      并请求新布局。这将重新布局recyclerView,底部有一些不可见的部分
    • 现在,您可以对RecyclerView和Header的y平移设置动画,这样Header将移出屏幕,而RecyclerView将变高。这会让用户感觉到recyclerview“扩展”
    • 动画完成后-将自定义标志设置为
      false
      ,并将标题的可见性更改为
      GONE
      ,因为它现在已离开屏幕
  • 以下是有关实现自定义
    onMeasure
    逻辑的一些信息:

    选项2就是我最后要做的。自定义布局,可在测量前移动其子对象-允许我根据需要更改高度。真糟糕,这么难!是 啊在Android上,“成长”动画一直是个麻烦:(你能发布一些你用来解决问题的代码吗?当内容改变时,我需要改变RecyclerView的高度,但我不知道从哪里开始动画。