折叠CardView动画无法正常工作

Mau*_*ker 14 android android-animation kotlin android-transitions android-recyclerview

我想做什么

我有RecyclerView很多项目,基本上是一些CardView.

这些卡片在他们的身体中间有一个支持文本,GONE默认情况下可见性设置为,VISIBLE当我点击卡片右侧的箭头时,它就会生成.

我正在尝试在文本显示的同时对卡进行动画处理,同时它会崩溃.

下图显示了扩展卡和折叠卡:

牌

CardView布局(我已经删除了可读性某些部分):

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="3dp"
    card_view:cardElevation="4dp"
    card_view:cardUseCompatPadding="true"
    android:id="@+id/root">

    <LinearLayout
        android:id="@+id/item_ll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="@dimen/activity_vertical_margin">

        <!-- The header with the title and the item -->


        <TextView
            android:id="@+id/body_content"
            style="@style/TextAppearance.AppCompat.Medium"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:layout_marginBottom="8dp"
            android:text="@string/about_page_description"
            android:textColor="@color/secondaryText"
            android:visibility="gone"/>

        <!-- The divider, and the footer with the timestamp -->

    </LinearLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)

问题

当卡片展开并露出身体时TextView,动画正在工作,但是,当我试图将其折叠回来时,动画片下方的卡片与第一张卡片重叠.

例:

卡片动画

到目前为止我尝试过的

我之前已经在这里问了一个关于这种行为类似问题,但是这个解决方案并不适用TextView于卡片的中间位置.

负责动画部分的代码在RecyclerView适配器内部.箭头有一个点击监听器,可以调用以下方法:

private fun toggleVisibility() {
    if (bodyContent.visibility == View.GONE || bodyContent.visibility == View.INVISIBLE) {
        btSeeMore.animate().rotation(180f).start()
        TransitionManager.beginDelayedTransition(root, AutoTransition())
        bodyContent.visibility = View.VISIBLE
    }
    else {
        btSeeMore.animate().rotation(0f).start()

        TransitionManager.beginDelayedTransition(root, AutoTransition())
        bodyContent.visibility = View.GONE
    }
}
Run Code Online (Sandbox Code Playgroud)

哪里root是我的CardView.

我也尝试使用LinearLayout而不是卡本身来进行延迟转换,但这也不起作用.

如何为我的布局实现这种行为?

Jul*_* Os 5

您必须在 RecyclerView 上执行转换,而不是在单个项目上执行。否则,自动转换不会考虑 RecyclerView 布局更改,因为它只会查看该子视图中的更改,即使事实上其他 ViewHolder 受到间接影响(布局参数正在更改)。

因此,不要将“root”(项目视图)传递给 TransitionManager#beginDelayedTransition,而是传递对 RecyclerView 的引用


Tpo*_*6oH 0

我建议您使用 Animator 框架并将高度动画应用到您的 TextView。

这是一个不错的库,您可以使用:https ://github.com/cachapa/ExpandableLayout

我还建议您检查它的源代码,它使用动画器