TL; DR: Ich suche nach einem vollständigen Beispiel für das Szenario "Google Mail-Drei-Fragment-Animation". Insbesondere möchten wir mit zwei Fragmenten beginnen:
Bei einem UI-Ereignis (z. B. Tippen auf etwas in Fragment B) möchten wir:
- Fragment A, um vom Bildschirm nach links zu rutschen
- Fragment B wird an den linken Bildschirmrand geschoben und verkleinert, um die von Fragment A frei gewordene Stelle einzunehmen
- Fragment C, um von der rechten Seite des Bildschirms hinein zu gleiten und die von Fragment B frei gewordene Stelle einzunehmen
Und bei einem BACK-Tastendruck möchten wir, dass diese Operationen umgekehrt werden.
Jetzt habe ich viele Teilimplementierungen gesehen; Ich werde vier davon unten überprüfen. Abgesehen davon, dass sie unvollständig sind, haben sie alle ihre Probleme.
@Reto Meier hat diese beliebte Antwort auf dieselbe grundlegende Frage beigesteuert und darauf hingewiesen , dass Sie sie setCustomAnimations()
mit a verwenden würden FragmentTransaction
. Für ein Szenario mit zwei Fragmenten (z. B. sehen Sie Fragment A zunächst nur und möchten es mithilfe animierter Effekte durch ein neues Fragment B ersetzen) stimme ich voll und ganz zu. Jedoch:
- Da Sie nur eine "In" - und eine "Out" -Animation angeben können, kann ich nicht sehen, wie Sie mit all den verschiedenen Animationen umgehen würden, die für das Drei-Fragment-Szenario erforderlich sind
- Der
<objectAnimator>
in seinem Beispielcode verwendete fest verdrahtete Positionen in Pixel, und dies scheint angesichts unterschiedlicher Bildschirmgrößen unpraktisch zu sein,setCustomAnimations()
erfordert jedoch Animationsressourcen, was die Möglichkeit ausschließt, diese Dinge in Java zu definieren - Ich bin ratlos , wie das Objekt Animateure für Skala Krawatte in mit Dingen wie
android:layout_weight
in einemLinearLayout
Raum auf prozentuale Basis für die Zuteilung - Ich weiß nicht, wie Fragment C zu Beginn behandelt wird (
GONE
?android:layout_weight
Von0
? Voranimiert auf eine Skala von 0? Etwas anderes?)
@Roman Nurik weist darauf hin, dass Sie jede Eigenschaft animieren können , auch solche, die Sie selbst definieren. Dies kann helfen, das Problem der fest verdrahteten Positionen zu lösen, und zwar auf Kosten der Erfindung Ihrer eigenen benutzerdefinierten Layout-Manager-Unterklasse. Das hilft einigen, aber ich bin immer noch verblüfft über den Rest der Reto-Lösung.
Der Autor dieses Pastebin-Eintrags zeigt einen verlockenden Pseudocode, der im Grunde besagt, dass sich alle drei Fragmente anfänglich im Container befinden würden, wobei Fragment C zu Beginn über eine hide()
Transaktionsoperation ausgeblendet wurde . Wir dann show()
C und hide()
A, wenn das UI-Ereignis auftritt. Ich sehe jedoch nicht, wie das mit der Tatsache umgeht, dass B die Größe ändert. Es hängt auch von der Tatsache ab, dass Sie anscheinend mehrere Fragmente zum selben Container hinzufügen können, und ich bin mir nicht sicher, ob dies auf lange Sicht ein verlässliches Verhalten ist oder nicht (ganz zu schweigen davon findFragmentById()
, dass es kaputt gehen sollte , obwohl ich damit leben kann).
Der Autor dieses Blogposts gibt an, dass Google Mail überhaupt keine verwendet setCustomAnimations()
, sondern direkt Objektanimatoren verwendet ("Sie ändern nur den linken Rand der Stammansicht + ändern die Breite der rechten Ansicht"). Dies ist jedoch immer noch eine AFAICT-Lösung mit zwei Fragmenten, und die Implementierung zeigt erneut die Abmessungen der Festdrähte in Pixel.
Ich werde mich weiterhin damit beschäftigen, damit ich eines Tages selbst darauf antworten kann, aber ich hoffe wirklich, dass jemand die Drei-Fragment-Lösung für dieses Animationsszenario ausgearbeitet hat und den Code (oder einen Link dazu) veröffentlichen kann. Animationen in Android bringen mich dazu, mir die Haare auszureißen, und diejenigen unter Ihnen, die mich gesehen haben, wissen, dass dies ein weitgehend erfolgloses Unterfangen ist.