RecyclerView – animar el cambio de las columnas del gestor de diseño de cuadrícula

Quiero animar el cambio de mi RecyclerView s GridLayoutManager . I defaulty mostrar una lista de elementos en una cuadrícula con 3 columnas y el usuario puede seleccionar para mostrar más o menos columnas.

Me gustaría que las views en el RecyclerView para mover / escala a sus nuevas posiciones, pero no tengo ni idea de cómo esto podría hacerse.

Lo que quiero al final

  • Permiten escalar la rejilla a través de un gesto de tacto expand / contract => sé cómo hacer eso
  • LayoutManager el cambio del LayoutManager

¿Alguien sabe cómo puedo animar el cambio de LayoutManager ?

La fuente de inspiración aquí sería la aplicación de Google Fotos, la aplicación de Sony Gallery

Hay básicamente 2 acercamientos que usted puede ir con:

  1. Modifica el spancount de GridLayoutManager utilizando setSpanCount (int)

  2. Se establece un recuento de span muy alto (~ 100) que utiliza SpanSizeLookUp para cambiar el spanSize por ítem en marcha.

    • He utilizado el Gist proporcionado por Musenkishi, para que esta respuesta proporcione un animador para animar los cambios en los cambios del diseño de la rejilla
    • He utilizado este enfoque en una muestra GitHub proyecto de aplicación de la misma.
    • Advertencias:
      • He utilizado actualmente el oyente del tecleo para guardar el modificar de la mirada del tamaño del palmo para arriba. Esto podría ser cambiado a un ItemGestureListener para capturar los acontecimientos del pellizco del zumbido y para cambiar por consiguiente.
      • Debe determinar una forma de elegir un recuento de span para que todos los elementos de una fila ocupen todo el ancho de la pantalla (y por lo tanto no ve ningún espacio vacío)
      • Usted llama a notifyItemRangeChanged usando una publicación runnable retrasada ya que no puede llamar a los métodos notifyChanged desde dentro de bindView / createView, etc.
      • Después de cambiar el tamaño de la extensión, usted necesita notifyItemRangeChanged con un rango apropiado de modo que todos los artículos exhibidos actualmente en la pantalla sean desplazados en consecuencia. He utilizado (código en la parte inferior)

Esto no es una solución completa pero una solución de 2 horas para el mismo. Usted puede mejorar obviamente en todos los puntos mencionados :). Espero seguir actualizando la muestra ya que este tipo de puntos de vista siempre me han fascinado. No vea esto como la solución final, sino sólo una manera particular de lograr este enfoque. Si utilizas un StaggerredLayoutManager, puedes evitar fácilmente espacios en blanco entre los elementos.

 public int calculateRange() { int start = ((GridLayoutManager) grv.getLayoutManager()).findFirstVisibleItemPosition(); int end = ((GridLayoutManager) grv.getLayoutManager()).findLastVisibleItemPosition(); if (start < 0) start = 0; if (end < 0) end = getItemCount(); return end - start; } 

Trato con el mismo problema que tú, y hasta ahora no he encontrado una buena solución.

Simple cambio de número de columnas en GridLayoutManager parece raro por lo que ahora uso la animación para desaparecer / en el diseño completo. Algo como esto:

 private void animateRecyclerLayoutChange(final int layoutSpanCount) { Animation fadeOut = new AlphaAnimation(1, 0); fadeOut.setInterpolator(new DecelerateInterpolator()); fadeOut.setDuration(400); fadeOut.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { productsRecyclerLayoutManager.setSpanCount(layoutSpanCount); productsRecyclerLayoutManager.requestLayout(); Animation fadeIn = new AlphaAnimation(0, 1); fadeIn.setInterpolator(new AccelerateInterpolator()); fadeIn.setDuration(400); productsRecycler.startAnimation(fadeIn); } }); productsRecycler.startAnimation(fadeOut); } 

Si combina Fade Out / In animación con escala de cada elemento visible, Será una animación decente para GridLayoutManager cambios.

Usted puede hacer esto con el "detector de gestos" ver el tutorial de ejemplo aquí http://wiki.workassis.com/pinch-zoom-in-recycler-view/ En este tutorial vamos a buscar imágenes de la galería y mostrarlas en un diseño de cuadrícula En vista de reciclador. Usted será capaz de cambiar el diseño en el gesto de pellizco. A continuación se muestran las capturas de pantalla de diferentes diseños.

 mScaleGestureDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() { @Override public boolean onScale(ScaleGestureDetector detector) { if (detector.getCurrentSpan() > 200 && detector.getTimeDelta() > 200) { if (detector.getCurrentSpan() - detector.getPreviousSpan() < -1) { if (mCurrentLayoutManager == mGridLayoutManager1) { mCurrentLayoutManager = mGridLayoutManager2; mRvPhotos.setLayoutManager(mGridLayoutManager2); return true; } else if (mCurrentLayoutManager == mGridLayoutManager2) { mCurrentLayoutManager = mGridLayoutManager3; mRvPhotos.setLayoutManager(mGridLayoutManager3); return true; } } else if(detector.getCurrentSpan() - detector.getPreviousSpan() > 1) { if (mCurrentLayoutManager == mGridLayoutManager3) { mCurrentLayoutManager = mGridLayoutManager2; mRvPhotos.setLayoutManager(mGridLayoutManager2); return true; } else if (mCurrentLayoutManager == mGridLayoutManager2) { mCurrentLayoutManager = mGridLayoutManager1; mRvPhotos.setLayoutManager(mGridLayoutManager1); return true; } } } return false; } }); 
  • Cuándo usar ListView en lugar de RecyclerView
  • El adaptador de RecyclerView notifyDataSetChanged no funciona
  • SwipeRefreshLayout está oculto en vacío RecyclerView
  • Pasar los datos de los elementos de los clics hechos por RecyclerView CardView a la actividad
  • Horizontal RecyclerView interior vertical ScrollView
  • Cómo implementar correctamente un adaptador para un ListView
  • Deshabilitar haga clic en RecyclerView dentro de un SwipeRefreshLayout
  • Causa de NullPointerException android.support.v7.widget.RecyclerView.onMeasure
  • Establecer contentInset en RecyclerView
  • ¿Cómo animar las transiciones de actividad cuando se usan listas / cuadrículas / vistas de reciclador?
  • StaggeredGridLayoutManager y elementos en movimiento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.