animation时折叠CardView里面的RecyclerView

我正在尝试做什么

我有一个CardView底部的支持文本默认情况下是GONE的。 我只想在用户点击“动作箭头”时才可以看到这部分卡片,如下图所示:

展开箭头

我知道我可以通过简单地将View可见性设置为可见来实现这一点,但是我也想对展开和折叠事件进行animation处理。

这个问题以及我迄今为止所尝试的

为此,我使用了CardView xml中的android:animateLayoutChanges="true"属性,并且在扩展时工作正常。 但是,一旦我再次点击箭头折叠支持文本,下面的卡片重叠了我在animation过程中点击过的卡片。 我怎样才能避免这种重叠?

编辑:我知道这可能是做这个问题上的解决scheme ,但似乎过于复杂,因为android:animateLayoutChanges选项存在。 我想知道是否有可能解决我的问题,使用该XML属性,保持简单。

我的animation代码如下:

Java代码

 protected void expandCard() { if (isExpanded) { ibt_show_more.animate().rotation(0).start(); isExpanded = false; tv_support.setVisibility(View.GONE); } else { ibt_show_more.animate().rotation(180).start(); isExpanded = true; tv_support.setVisibility(View.VISIBLE); } } 

XML代码

 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/spacing_small" card_view:cardCornerRadius="2dp" android:id="@+id/os_list_item_cv"> <RelativeLayout android:id="@+id/os_list_item_rl_root" android:layout_width="match_parent" android:layout_height="match_parent" android:animateLayoutChanges="true"> <!-- Here goes the header, the image, the action buttons and so on --> <!-- Omitted on purpose --> <!-- ... --> <!-- This is the support TextView --> <TextView android:id="@+id/tv_support" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/os_list_item_rl_actions" android:text="@string/bacon_ipsum" android:paddingBottom="24dp" android:paddingEnd="16dp" android:paddingRight="16dp" android:paddingLeft="16dp" android:paddingStart="16dp" android:visibility="gone"/> </RelativeLayout> </android.support.v7.widget.CardView> 

GIF的完整性(错误的崩溃行为)

在这里输入图像说明

在更改可见性之前,请添加以下代码行:

 TransitionManager.beginDelayedTransition(the rootView containing the cardView, new AutoTransition()); 

你应该得到一个stream畅的animation。 在此之前,从xml中删除“animateLayoutChanges = true”。

至于为什么这样做,调用TransitionManager.beginDelayedTransition()使TransitionManger捕获父ViewGroup中的当前值,并在下一个animation帧中呈现animation。 在这种情况下传递的过渡是一个AutoTransition ,它负责处理父ViewGroup中的所有淡入淡出,移动和resize。

请参阅转换和TransitionManager

在适当情况下,还要注意从支持库中使用转换,或者执行必要的API级别检查。