crossfade change card animate android android-animation android-cardview

android - change - Contraer CardView dentro de RecyclerView al animar



crossfade animation android (1)

Justo antes de cambiar la visibilidad, agregue esta línea de código:

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

Deberías obtener una animación suave. También elimine "animateLayoutChanges = true" de su xml antes de esto.

En cuanto a por qué funciona esto, llamar a TransitionManager.beginDelayedTransition () hace que TransitionManger capture los valores actuales en el ViewGroup principal y renderice las animaciones en el siguiente cuadro de animación. La Transición aprobada en este caso es una AutoTransition , que se encarga de todo el desvanecimiento, movimiento y cambio de tamaño en el ViewGroup primario.

Ver Transitions y TransitionManager

También tenga cuidado de usar Transiciones de la biblioteca de asistencia cuando sea apropiado, o realice las comprobaciones de nivel API necesarias.

Lo que estoy tratando de hacer

Tengo un CardView con un texto de apoyo en la parte inferior que se va a GONE de forma predeterminada. Quiero que esta sección de la tarjeta sea visible solo cuando el usuario haga clic en la "flecha de acción", como se muestra en la siguiente imagen:

Sé que puedo lograrlo simplemente estableciendo esa visibilidad de View en VISIBLE , pero también quiero animar los eventos de expansión y contracción.

El problema y lo que he intentado hasta ahora.

Para hacerlo, he usado la android:animateLayoutChanges="true" en mi CardView xml, y funciona bien cuando se está expandiendo. Pero una vez que vuelvo a hacer clic en la flecha para contraer el texto de apoyo, la siguiente tarjeta se superpone a la tarjeta en la que hice clic durante la animación. ¿Cómo puedo evitar esta superposición?

EDIT: Sé que puede ser posible hacer algo como la solución a esta pregunta , pero parece demasiado complicado ya que existe la opción android:animateLayoutChanges . Me pregunto si es posible resolver mi problema usando esa propiedad XML, para mantenerlo simple.

Mi código de animación es el siguiente:

Código 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); } }

Código 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 para completar (con comportamiento de colapso incorrecto)