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>