In iOS gibt es eine sehr einfache und leistungsstarke Funktion zum Animieren des Hinzufügens und Entfernens von UITableView-Zeilen. Hier ist ein Clip aus einem Youtube-Video, das die Standardanimation zeigt. Beachten Sie, wie die umgebenden Zeilen auf die gelöschte Zeile fallen. Diese Animation hilft Benutzern zu verfolgen, was sich in einer Liste geändert hat und wo in der Liste sie sich angesehen haben, als sich die Daten geändert haben.
Seit ich auf Android entwickelt habe, habe ich keine gleichwertige Möglichkeit gefunden, einzelne Zeilen in einer TableView zu animieren . Der Aufruf notifyDataSetChanged()
auf meinem Adapter bewirkt , dass der Listview sofort seinen Inhalt mit neuen Informationen zu aktualisieren. Ich möchte eine einfache Animation einer neuen Zeile zeigen, die sich ein- oder ausschiebt, wenn sich die Daten ändern, aber ich kann keinen dokumentierten Weg finden, dies zu tun. Es sieht so aus, als ob LayoutAnimationController einen Schlüssel enthält, um dies zum Laufen zu bringen, aber wenn ich einen LayoutAnimationController in meiner ListView einstelle (ähnlich wie LayoutAnimation2 von ApiDemo ) einstelle und Elemente aus meinem Adapter entferne, nachdem die Liste angezeigt wurde, verschwinden die Elemente sofort, anstatt animiert zu werden .
Ich habe auch Folgendes versucht, um ein einzelnes Element zu animieren, wenn es entfernt wird:
@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);
}
Die die animierte Zeile umgebenden Zeilen verschieben jedoch ihre Position erst, wenn sie zu ihren neuen Positionen springen notifyDataSetChanged()
Aufruf . Es scheint, dass ListView sein Layout nicht aktualisiert, sobald seine Elemente platziert wurden.
Während mir das Schreiben meiner eigenen Implementierung / Fork von ListView in den Sinn gekommen ist, scheint dies etwas zu sein, das nicht so schwierig sein sollte.
Vielen Dank!
Antworten:
für Animationen von oben nach unten:
quelle
anim.setAnimationListener(new AnimationListener() { ... })
, als einen Handler zu verwendenpopulateList()
für?Handler
. Zweitens wird der Code weniger komplex, da bereits ein integrierter Rückruf verwendet wird, wenn die Animation beendet ist. Drittens wissen Sie nicht, wie die Implementierung auf jeder Plattform funktioniertHandler
undAnimation
wie sie funktionieren wird. Möglicherweise tritt Ihre verzögerte Ausführung vor Abschluss der Animation auf.Das
RecyclerView
kümmert sich um das Hinzufügen, Entfernen und Neuanordnen von Animationen!Dieses einfache AndroidStudio-Projekt bietet a
RecyclerView
. Schauen Sie sich die Commits an :quelle
Schauen Sie sich die Google-Lösung an. Hier ist nur eine Löschmethode.
ListViewRemovalAnimation- Projektcode und Video - Demonstration
Es benötigt Android 4.1+ (API 16). Aber wir haben 2014 draußen.
quelle
Da sie
ListViews
stark optimiert sind, denke ich, dass dies nicht möglich ist, dies zu erreichen. Haben Sie versucht, Ihre "ListView" per Code zu erstellen (dh indem Sie Ihre Zeilen aus XML aufblasen und an a anhängenLinearLayout
) und sie animieren?quelle
LinearLayout
, aber bei sehr großen Datenmengen wirdLinearLayout
die Leistung miserabel.ListView
Es gibt viele intelligente Optimierungen für das Recycling von Ansichten, die es ermöglichen, große Datenmengen zu verarbeiten (UITableView von iOS verfügt über dieselben Optimierungen). Das Schreiben meiner eigenen Ansicht Recycler fällt unter die Kategorie der Neuimplementierung von ListView :(Haben Sie darüber nachgedacht, einen Sweep nach rechts zu animieren? Sie können beispielsweise einen zunehmend größeren weißen Balken über das Listenelement ziehen und ihn dann aus der Liste entfernen. Die anderen Zellen würden immer noch einrasten, aber es wäre besser als nichts.
quelle
call listView.scheduleLayoutAnimation (); bevor Sie die Liste ändern
quelle
Ich habe einen anderen Weg zusammen gehackt, ohne die Listenansicht manipulieren zu müssen. Leider scheinen reguläre Android-Animationen den Inhalt der Zeile zu manipulieren, sind jedoch nicht effektiv, um die Ansicht tatsächlich zu verkleinern. Betrachten Sie also zuerst diesen Handler:
Fügen Sie diese Sammlung Ihrem Listenadapter hinzu:
und hinzufügen
Fügen Sie als Nächstes, wo immer Sie eine Zeile ausblenden möchten, Folgendes hinzu:
Das ist es! Sie können die Geschwindigkeit der Animation ändern, indem Sie die Anzahl der Pixel ändern, um die die Höhe gleichzeitig verringert wird. Nicht wirklich raffiniert, aber es funktioniert!
quelle
Nachdem ich eine neue Zeile in ListView eingefügt habe, scrolle ich einfach die ListView an eine neue Position.
quelle
Ich habe es nicht ausprobiert, aber es sieht so aus, als ob animateLayoutChanges das tun sollte, wonach Sie suchen. Ich sehe es in der ImageSwitcher-Klasse. Ich nehme an, es ist auch in der ViewSwitcher-Klasse.
quelle
Da Android Open Source ist, müssen Sie die Optimierungen von ListView nicht erneut implementieren. Sie können den Code von ListView abrufen und versuchen, einen Weg zu finden, die Animation zu hacken. Sie können auch eine Funktionsanforderung im Android Bug Tracker öffnen (und wenn Sie sich für die Implementierung entschieden haben, vergessen Sie nicht, einen Patch beizusteuern ).
Zu Ihrer Information, der ListView-Quellcode ist hier .
quelle
Hier ist der Quellcode , mit dem Sie Zeilen löschen und neu anordnen können.
Eine Demo-APK-Datei ist ebenfalls verfügbar. Das Löschen von Zeilen erfolgt eher in Anlehnung an die Google Mail-App, die nach dem Wischen einer Draufsicht eine Unteransicht anzeigt. Die Unteransicht kann eine Schaltfläche zum Rückgängigmachen oder was auch immer Sie wollen haben.
quelle
Wie ich meinen Ansatz auf meiner Website erklärt hatte, habe ich den Link geteilt. Die Idee ist immer, Bitmaps mit getdrawingcache zu erstellen. Habe zwei Bitmaps und animiere die untere Bitmap, um den Bewegungseffekt zu erzeugen
Bitte beachten Sie den folgenden Code:
Zum Verständnis mit Bildern siehe dies
Vielen Dank.
quelle
Ich habe etwas Ähnliches getan. Ein Ansatz besteht darin, über die Animationszeit die Höhe der Ansicht über die Zeit innerhalb der Zeilen zu interpolieren,
onMeasure
währendrequestLayout()
für die listView ausgegeben wird. Ja, es ist vielleicht besser, direkt im listView-Code zu arbeiten, aber es war eine schnelle Lösung (das sah gut aus!)quelle
Teilen Sie einfach einen anderen Ansatz:
Setzen Sie zuerst das Android: animateLayoutChanges der Listenansicht auf true :
Dann benutze ich einen Handler , um Elemente hinzuzufügen und die Listenansicht mit Verzögerung zu aktualisieren:
quelle