Dans iOS, il existe une fonction très simple et puissante pour animer l'ajout et la suppression de lignes UITableView, voici un extrait d'une vidéo youtube montrant l'animation par défaut. Notez comment les lignes environnantes se replient sur la ligne supprimée. Cette animation aide les utilisateurs à suivre ce qui a changé dans une liste et où dans la liste ils regardaient quand les données ont changé.
Depuis que je développe sur Android, je n'ai trouvé aucune facilité équivalente pour animer des lignes individuelles dans une TableView . En appelant notifyDataSetChanged()
mon adaptateur, ListView met immédiatement à jour son contenu avec de nouvelles informations. Je voudrais montrer une animation simple d'une nouvelle ligne poussant ou glissant lorsque les données changent, mais je ne trouve aucun moyen documenté de le faire. Il semble que LayoutAnimationController puisse détenir une clé pour que cela fonctionne, mais lorsque je définis un LayoutAnimationController sur ma ListView (similaire à LayoutAnimation2 d'ApiDemo ) et que je supprime des éléments de mon adaptateur après l'affichage de la liste, les éléments disparaissent immédiatement au lieu d'être animés. .
J'ai également essayé des choses comme les suivantes pour animer un élément individuel lorsqu'il est supprimé:
@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);
}
Cependant, les lignes entourant la ligne animée ne bougent pas jusqu'à ce qu'elles sautent à leur nouvelle position lors de l' notifyDataSetChanged()
appel. Il semble que ListView ne met pas à jour sa disposition une fois ses éléments placés.
Bien que l'écriture de ma propre implémentation / fork de ListView me soit venue à l'esprit, cela semble être quelque chose qui ne devrait pas être si difficile.
Merci!
Réponses:
pour une animation de haut en bas:
la source
anim.setAnimationListener(new AnimationListener() { ... })
au lieu d'utiliser un gestionnairepopulateList()
?Handler
. Deuxièmement, il rend le code moins complexe en utilisant déjà un rappel intégré pour la fin de l'animation. Troisièmement, vous ne savez pas comment la mise en œuvre deHandler
etAnimation
fonctionnera sur chaque plate-forme; il est possible que votre exécutable retardé se produise avant la fin de l'animation.Le
RecyclerView
prend en charge l'ajout, la suppression et la réorganisation des animations!Ce projet AndroidStudio simple comprend
RecyclerView
: jetez un œil aux commits :la source
Jetez un œil à la solution Google. Voici une méthode de suppression uniquement.
Code de projet ListViewRemovalAnimation et démonstration vidéo
Il a besoin d'Android 4.1+ (API 16). Mais nous avons 2014 à l'extérieur.
la source
Étant donné qu'ils
ListViews
sont hautement optimisés, je pense que ce n'est pas possible de répondre. Avez-vous essayé de créer votre "ListView" par code (c'est-à-dire en gonflant vos lignes de xml et en les ajoutant à aLinearLayout
) et en les animant?la source
LinearLayout
, mais avec de très grands ensemblesLinearLayout
de données , les performances deviendront abyssales.ListView
a beaucoup d'optimisations intelligentes autour du recyclage des vues qui lui permettent de gérer de grands ensembles de données (UITableView d'iOS a les mêmes optimisations). Écrire mon propre recycleur de vues tombe dans la catégorie de la réimplémentation de ListView :(Avez-vous pensé à animer un balayage vers la droite? Vous pouvez faire quelque chose comme dessiner une barre blanche progressivement plus grande en haut de l'élément de liste, puis la supprimer de la liste. Les autres cellules continueraient à se mettre en place, mais ce serait mieux que rien.
la source
appelez listView.scheduleLayoutAnimation (); avant de changer la liste
la source
J'ai piraté ensemble une autre façon de le faire sans avoir à manipuler la vue de liste. Malheureusement, les animations Android régulières semblent manipuler le contenu de la ligne, mais ne permettent pas de réduire la vue. Alors, considérez d'abord ce gestionnaire:
Ajoutez cette collection à votre adaptateur de liste:
et ajouter
Ensuite, où que vous souhaitiez masquer une ligne, ajoutez ceci:
C'est tout! Vous pouvez modifier la vitesse de l'animation en modifiant le nombre de pixels dont elle réduit la hauteur à la fois. Pas vraiment sophistiqué, mais ça marche!
la source
Après avoir inséré une nouvelle ligne dans ListView, je fais simplement défiler ListView vers une nouvelle position.
la source
Je ne l'ai pas essayé, mais il semble que animateLayoutChanges devrait faire ce que vous recherchez. Je le vois dans la classe ImageSwitcher, je suppose que c'est aussi dans la classe ViewSwitcher?
la source
Comme Android est open source, vous n'avez pas réellement besoin de réimplémenter les optimisations de ListView. Vous pouvez récupérer le code de ListView et essayer de trouver un moyen de pirater l'animation, vous pouvez également ouvrir une demande de fonctionnalité dans le suivi des bogues Android (et si vous avez décidé de l'implémenter, n'oubliez pas de contribuer un correctif ).
Pour info, le code source de ListView est ici .
la source
Voici le code source pour vous permettre de supprimer des lignes et de les réorganiser.
Un fichier APK de démonstration est également disponible. La suppression des lignes se fait plus dans le sens de l'application Gmail de Google qui révèle une vue de dessous après avoir glissé une vue de dessus. La vue inférieure peut avoir un bouton Annuler ou tout ce que vous voulez.
la source
Comme je l'avais expliqué dans mon site, j'ai partagé le lien. Quoi qu'il en soit, l'idée est de créer des bitmaps par getdrawingcache.
Veuillez consulter le code suivant:
Pour comprendre les images, voir ceci
Merci.
la source
J'ai fait quelque chose de similaire à cela. Une approche consiste à interpoler sur la durée de l'animation la hauteur de la vue dans le temps à l'intérieur des lignes
onMeasure
lors de l'émissionrequestLayout()
pour listView. Oui, il peut être préférable de le faire directement dans le code listView mais c'était une solution rapide (qui avait l'air bien!)la source
Partageons simplement une autre approche:
Définissez d' abord l' androïde de la vue de liste : animateLayoutChanges sur true :
Ensuite, j'utilise un gestionnaire pour ajouter des éléments et mettre à jour la vue de liste avec retard:
la source