En iOS, existe una instalación muy fácil y poderosa para animar la adición y eliminación de filas UITableView, aquí hay un clip de un video de YouTube que muestra la animación predeterminada. Observe cómo las filas circundantes colapsan en la fila eliminada. Esta animación ayuda a los usuarios a realizar un seguimiento de lo que cambió en una lista y en qué parte de la lista estaban mirando cuando cambiaron los datos.
Desde que desarrollé en Android, no encontré ninguna instalación equivalente para animar filas individuales en un TableView . Llamar notifyDataSetChanged()
a mi adaptador hace que ListView actualice inmediatamente su contenido con nueva información. Me gustaría mostrar una animación simple de una nueva fila empujando o deslizándose cuando los datos cambian, pero no puedo encontrar ninguna forma documentada de hacerlo. Parece que LayoutAnimationController podría tener una clave para que esto funcione, pero cuando configuro un LayoutAnimationController en mi ListView (similar a LayoutAnimation2 de ApiDemo ) y elimino elementos de mi adaptador después de que la lista se haya mostrado, los elementos desaparecen inmediatamente en lugar de animarse. .
También he intentado cosas como las siguientes para animar un elemento individual cuando se elimina:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
Sin embargo, las filas que rodean la fila animada no se mueven de posición hasta que saltan a sus nuevas posiciones cuando notifyDataSetChanged()
se llama. Parece que ListView no actualiza su diseño una vez que se han colocado sus elementos.
Si bien escribir mi propia implementación / bifurcación de ListView me ha pasado por la mente, esto parece algo que no debería ser tan difícil.
¡Gracias!
Respuestas:
para uso de animación de arriba a abajo:
fuente
anim.setAnimationListener(new AnimationListener() { ... })
lugar de usar unpopulateList()
para?Handler
. En segundo lugar, hace que el código sea menos complejo al usar una devolución de llamada incorporada para cuando finalice la animación. En tercer lugar, no sabes cómo funcionará la implementaciónHandler
y elAnimation
funcionamiento de cada plataforma; Es posible que su ejecución demorada ocurra antes de que finalice la animación.¡El
RecyclerView
se encarga de agregar, eliminar y reordenar animaciones!Este sencillo proyecto de AndroidStudio presenta a
RecyclerView
. Echa un vistazo a los commits :fuente
Echa un vistazo a la solución de Google. Aquí hay un método de eliminación solamente.
Código de proyecto ListViewRemovalAnimation y demostración de video
Necesita Android 4.1+ (API 16). Pero tenemos 2014 afuera.
fuente
Como
ListViews
están altamente optimizados, creo que esto no es posible. ¿Ha intentado crear su "ListView" por código (es decir, al inflar sus filas desde xml y agregarlas a aLinearLayout
) y animarlas?fuente
LinearLayout
, sin embargo, con conjuntosLinearLayout
de datos muy grandes , el rendimiento se volverá abismal.ListView
tiene muchas optimizaciones inteligentes en torno al reciclaje de vistas que le permiten manejar grandes conjuntos de datos (UITableView de iOS tiene las mismas optimizaciones). Al escribir mi propio punto de vista, el reciclador cae en la categoría de reimplementar ListView :(¿Has considerado animar un barrido a la derecha? Podría hacer algo como dibujar una barra blanca progresivamente más grande en la parte superior del elemento de la lista y luego eliminarla de la lista. Las otras células todavía se moverían en su lugar, pero sería mejor que nada.
fuente
llame a listView.scheduleLayoutAnimation (); antes de cambiar la lista
fuente
Pirateé juntos otra forma de hacerlo sin tener que manipular la vista de lista. Desafortunadamente, las animaciones normales de Android parecen manipular el contenido de la fila, pero no son efectivas para reducir la vista. Entonces, primero considere este controlador:
Agregue esta colección a su adaptador de lista:
y añadir
A continuación, donde sea que desee ocultar una fila, agregue esto:
¡Eso es! Puede cambiar la velocidad de la animación alterando el número de píxeles que reduce la altura a la vez. No es realmente sofisticado, ¡pero funciona!
fuente
Después de insertar una nueva fila en ListView, simplemente desplazo el ListView a la nueva posición.
fuente
No lo he probado, pero parece que animarLayoutChanges debería hacer lo que estás buscando. Lo veo en la clase ImageSwitcher, ¿supongo que también está en la clase ViewSwitcher?
fuente
Dado que Android es de código abierto, no es necesario que vuelva a implementar las optimizaciones de ListView. Puede obtener el código de ListView e intentar encontrar una manera de piratear la animación, también puede abrir una solicitud de función en el rastreador de errores de Android (y si decidió implementarlo, no olvide contribuir con un parche ).
Para su información, el código fuente ListView está aquí .
fuente
Aquí está el código fuente para permitirle eliminar filas y reordenarlas.
Un archivo APK de demostración también está disponible. La eliminación de filas se realiza más en la línea de la aplicación Gmail de Google que revela una vista inferior después de deslizar una vista superior. La vista inferior puede tener un botón Deshacer o lo que quieras.
fuente
Como ya había explicado mi enfoque en mi sitio, compartí el enlace. De todos modos, la idea es crear mapas de bits mediante getdrawingcache .tienen dos mapas de bits y animan el mapa de bits inferior para crear el efecto de movimiento
Por favor vea el siguiente código:
Para entender con imágenes vea esto
Gracias.
fuente
He hecho algo similar a esto. Un enfoque es interpolar durante el tiempo de animación la altura de la vista a lo largo del tiempo dentro de las filas
onMeasure
mientras se emiterequestLayout()
la lista Vista. Sí, puede ser mejor hacerlo directamente dentro del código listView, pero fue una solución rápida (¡eso se veía bien!)fuente
Simplemente compartiendo otro enfoque:
Primero configure Android de la vista de lista : animateLayoutChanges en true :
Luego uso un controlador para agregar elementos y actualizar la vista de lista con retraso:
fuente