Cómo animar los elementos de RecyclerView cuando aparecen

¿Cómo puedo animar las RecyclerViews cuando aparecen?

El animador de elementos predeterminado sólo se anima cuando se agregan o eliminan datos una vez que se han establecido los datos del reciclador. Soy nuevas aplicaciones en desarrollo, y no tengo ni idea de por dónde empezar.

¿Alguna idea de cómo lograrlo?

EDIT:

De acuerdo con la documentación ItemAnimator :

Esta clase define las animaciones que tienen lugar en los elementos a medida que se realizan cambios en el adaptador.

Tan a menos que usted agrega sus artículos uno por uno a su RecyclerView y refresca la visión en cada iteración, no pienso que ItemAnimator es la solución a su necesidad.

A continuación se muestra cómo puede animar los elementos de RecyclerView cuando aparecen con un CustomAdapter:

 public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> { private Context context; // The items to display in your RecyclerView private ArrayList<String> items; // Allows to remember the last item shown on screen private int lastPosition = -1; public static class ViewHolder extends RecyclerView.ViewHolder { TextView text; // You need to retrieve the container (ie the root ViewGroup from your custom_item_layout) // It's the view that will be animated FrameLayout container; public ViewHolder(View itemView) { super(itemView); container = (FrameLayout) itemView.findViewById(R.id.item_layout_container); text = (TextView) itemView.findViewById(R.id.item_layout_text); } } public CustomAdapter(ArrayList<String> items, Context context) { this.items = items; this.context = context; } @Override public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_item_layout, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.text.setText(items.get(position)); // Here you apply the animation when the view is bound setAnimation(holder.itemView, position); } /** * Here is the key method to apply the animation */ private void setAnimation(View viewToAnimate, int position) { // If the bound view wasn't previously displayed on screen, it's animated if (position > lastPosition) { Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); viewToAnimate.startAnimation(animation); lastPosition = position; } } } 

Y su custom_item_layout se vería así:

 <FrameLayout android:id="@+id/item_layout_container" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/item_layout_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceListItemSmall" android:gravity="center_vertical" android:minHeight="?android:attr/listPreferredItemHeightSmall"/> </FrameLayout> 

Para obtener más información acerca de CustomAdapters y RecyclerView , consulte este entrenamiento en la documentación oficial .

Problemas en el desplazamiento rápido

El uso de este método podría causar problemas con el desplazamiento rápido. La vista podría reutilizarse mientras la animación ha estado sucediendo. Para evitar que sea recomendable borrar la animación cuando se desprenda.

  @Override public void onViewDetachedFromWindow(final RecyclerView.ViewHolder holder) { ((CustomViewHolder)holder).clearAnimation(); } 

En CustomViewHolder:

  public void clearAnimation() { mRootLayout.clearAnimation(); } 

Respuesta antigua:

Echa un vistazo al repo de Gabriele Mariotti , estoy bastante seguro de que encontrarás lo que necesitas. Él proporciona simples ItemAnimators para el RecyclerView, como SlideInItemAnimator o SlideScaleItemAnimator.

Animated el descoloramiento adentro de los artículos de Recyclerview cuando aparecen primero como se muestra en el código abajo. Tal vez esto sea de utilidad para alguien.

 private final static int FADE_DURATION = 1000 // in milliseconds @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.getTextView().setText("some text"); // Set the view to fade in setFadeAnimation(holder.itemView); } private void setFadeAnimation(View view) { AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); anim.setDuration(FADE_DURATION); view.startAnimation(anim); } 

También puede reemplazar setFadeAnimation() con el siguiente setScaleAnimation() para animar la apariencia de los elementos al escalarlos desde un punto:

 private void setScaleAnimation(View view) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(FADE_DURATION); view.startAnimation(anim); } 

El código anterior tiene algunas verrugas en la medida en que cuando se desplaza los elementos de RecyclerView siempre se desvanecen o escalan. Si lo desea, puede añadir código para permitir que la animación ocurra cuando se crea primero el fragmento o la actividad que contiene el RecyclerView (por ejemplo, obtener la hora del sistema en la creación y sólo permitir la animación de los primeros milisegundos FADE_DURATION).

He creado la animación de la respuesta de pbm con poca modification para hacer que el aninmation se ejecute sólo una vez

En la otra palabra la Animation appear with you scroll down only

 private int lastPosition = -1; private void setAnimation(View viewToAnimate, int position) { // If the bound view wasn't previously displayed on screen, it's animated if (position > lastPosition) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501) viewToAnimate.startAnimation(anim); lastPosition = position; } } 

Y en onBindViewHolder llamar a la función

 @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.getTextView().setText("some text"); // call Animation function setAnimation(holder.itemView, position); } 

Un buen lugar para comenzar es este: https://github.com/wasabeef/recyclerview-animators/blob/master/animators/src/main/java/jp/wasabeef/recyclerview/adapters/AnimationAdapter.java

Ni siquiera necesita la biblioteca completa, esa clase es suficiente. Entonces si usted acaba de implementar su clase de adaptador dando un animador como este:

 @Override protected Animator[] getAnimators(View view) { return new Animator[]{ ObjectAnimator.ofFloat(view, "translationY", view.getMeasuredHeight(), 0) }; } @Override public long getItemId(final int position) { return getWrappedAdapter().getItemId(position); } 

Verá los elementos que aparecen desde la parte inferior a medida que se desplazan, evitando también el problema con el desplazamiento rápido.

La animación de elementos en el reciclerview cuando están enlazados en el adaptador no puede ser la mejor idea, ya que puede hacer que los elementos en el recyclerview para animar a diferentes velocidades. En mi caso, el elemento al final de la recyclerview animar a su posición más rápido, entonces los que están en la parte superior como los de la parte superior tienen más para viajar por lo que hizo que parezca desordenado.

El código original que usé para animar cada elemento en el reciclerview se puede encontrar aquí:

http://frogermcs.github.io/Instagram-with-Material-Design-concept-is-getting-real/

Pero voy a copiar y pegar el código en caso de que el enlace se rompa.

PASO 1: Establezca esto dentro de su método onCreate para asegurarse de que la animación sólo se ejecute una vez:

 if (savedInstanceState == null) { pendingIntroAnimation = true; } 

PASO 2: Necesitará poner este código en el método donde desea iniciar la animación:

 if (pendingIntroAnimation) { pendingIntroAnimation = false; startIntroAnimation(); } 

En el enlace, el escritor está animando los iconos de la barra de herramientas, por lo que lo puso dentro de este método:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); inboxMenuItem = menu.findItem(R.id.action_inbox); inboxMenuItem.setActionView(R.layout.menu_item_view); if (pendingIntroAnimation) { pendingIntroAnimation = false; startIntroAnimation(); } return true; } 

PASO 3: Ahora escriba la lógica para la startIntroAnimation ():

 private static final int ANIM_DURATION_TOOLBAR = 300; private void startIntroAnimation() { btnCreate.setTranslationY(2 * getResources().getDimensionPixelOffset(R.dimen.btn_fab_size)); int actionbarSize = Utils.dpToPx(56); toolbar.setTranslationY(-actionbarSize); ivLogo.setTranslationY(-actionbarSize); inboxMenuItem.getActionView().setTranslationY(-actionbarSize); toolbar.animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(300); ivLogo.animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(400); inboxMenuItem.getActionView().animate() .translationY(0) .setDuration(ANIM_DURATION_TOOLBAR) .setStartDelay(500) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { startContentAnimation(); } }) .start(); } 

Mi alternativa preferida:

Yo preferiría animar toda la recicla en vez de los elementos dentro de la reciclarvista.

Los PASOS 1 y 2 siguen siendo los mismos.

En el PASO 3, tan pronto como su llamada de la API vuelva con sus datos, comenzaría la animación.

 private void startIntroAnimation() { recyclerview.setTranslationY(latestPostRecyclerview.getHeight()); recyclerview.setAlpha(0f); recyclerview.animate() .translationY(0) .setDuration(400) .alpha(1f) .setInterpolator(new AccelerateDecelerateInterpolator()) .start(); } 

Esto animaría su recyclerview entero de modo que flys adentro de la parte inferior de la pantalla.

Sólo extiende su adaptador como a continuación

 public class RankingAdapter extends AnimatedRecyclerView<RankingAdapter.ViewHolder> 

Y agrega el método estupendo a onBindViewHolder

 @Override public void onBindViewHolder(ViewHolder holder, final int position) { super.onBindViewHolder(holder, position); 

Es forma automática de crear un adaptador animado como "Basheer AL-MOMANI"

 import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; import java.util.Random; /** * Created by eliaszkubala on 24.02.2017. */ public class AnimatedRecyclerView<T extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<T> { @Override public T onCreateViewHolder(ViewGroup parent, int viewType) { return null; } @Override public void onBindViewHolder(T holder, int position) { setAnimation(holder.itemView, position); } @Override public int getItemCount() { return 0; } protected int mLastPosition = -1; protected void setAnimation(View viewToAnimate, int position) { if (position > mLastPosition) { ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); anim.setDuration(new Random().nextInt(501));//to make duration random number between [0,501) viewToAnimate.startAnimation(anim); mLastPosition = position; } } } 

Cree este método en su adaptador de reciclaje

 private void setZoomInAnimation(View view) { Animation zoomIn = AnimationUtils.loadAnimation(context, R.anim.zoomin);// animation file view.startAnimation(zoomIn); } 

Y finalmente agregue esta línea de código en onBindViewHolder

setZoomInAnimation(holder.itemView);

  • Creación de una vista en forma de calendario con desplazamiento infinito en Android
  • Cómo refundir elementos en un RecyclerView con el StaggeredGridLayoutManager
  • Determinar la vista que aparece en LayoutManager pre-layout
  • SwipeRefreshLayout obstruye el desplazamiento de recycleview en el momento de desplazarse hacia arriba
  • RecyclerView horizontal con relleno inicial
  • Cómo implementar correctamente un adaptador para un ListView
  • ¿Hay alguna manera de mostrar una vista previa del contenido de RecyclerView en el editor de Android Studio?
  • Vaciar RecyclerView utilizando datos obtenidos de parse.com
  • Recyclerview y manejo de diferentes tipos de hilera de inflación
  • ¿Cómo auto desplazarse hasta Recycler ver en Android?
  • Cómo hacer un indicador de página para reciclaje horizontal
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.