Vollständiges Beispiel für das Gmail-Animationsszenario mit drei Fragmenten?

TL; DR: Ich suche einevollständige Arbeitsprobe von dem, was ich als "das Gmail-Dreifragment-Animationsszenario" bezeichnen werde. Im Einzelnen möchten wir mit zwei Fragmenten beginnen:

Bei einem UI-Ereignis (z. B. wenn Sie auf etwas in Fragment B tippen) möchten wir:

Fragment A, um vom Bildschirm nach links zu rutschenFragment B, um zum linken Rand des Bildschirms zu gleiten, und schrumpfen, um die von Fragment A frei gewordene Stelle aufzunehmenFragment C, um von der rechten Seite des Bildschirms einzuschieben und den von Fragment B freigewordenen Platz einzunehmen

Wenn Sie die Taste ZURÜCK drücken, möchten Sie, dass diese Operationen umgekehrt werden.

Jetzt habe ich viele Teilimplementierungen gesehen; Ich werde vier von ihnen unten überprüfen. Abgesehen davon, dass sie unvollständig sind, haben sie alle ihre Probleme.

@Reto Meier hat dazu beigetragendiese beliebte Antwort auf die gleiche grundlegende Frage, die angibt, dass Sie verwenden würdensetCustomAnimations() mit einerFragmentTransaction. Bei einem Szenario mit zwei Fragmenten (z. B. sehen Sie zunächst nur Fragment A und möchten es mit animierten Effekten durch ein neues Fragment B ersetzen) bin ich vollkommen einverstanden. Jedoch:

Da Sie nur eine "In" - und eine "Out" -Animation angeben können, kann ich nicht sehen, wie Sie mit den verschiedenen Animationen umgehen, die für das Szenario mit drei Fragmenten erforderlich sindDas<objectAnimator> In seinem Beispielcode werden fest verdrahtete Positionen in Pixeln verwendet, und dies scheint bei unterschiedlichen Bildschirmgrößen noch unpraktisch zu seinsetCustomAnimations() erfordert Animationsressourcen, was die Möglichkeit ausschließt, diese Dinge in Java zu definierenIch bin nicht sicher, wie die Objektanimatoren für die Skalierung mit Dingen wie verknüpft sindandroid:layout_weight in einemLinearLayout für die prozentuale Zuweisung von SpeicherplatzIch bin nicht sicher, wie Fragment C zu Beginn behandelt wird (GONE? android:layout_weight von0? auf einer Skala von 0 vorbelebt? etwas anderes?)

@ Roman Nurik weist darauf hinSie können jede Eigenschaft animiereneinschließlich solcher, die Sie selbst definieren. Dies kann helfen, das Problem der fest verdrahteten Positionen zu lösen, und zwar auf Kosten der Erfindung Ihrer eigenen Unterklasse für den benutzerdefinierten Layout-Manager. Das hilft einigen, aber ich bin immer noch verblüfft über den Rest von Retos Lösung.

Der Autor vondieser Pastebin Eintrag zeigt einen verlockenden Pseudocode, der im Grunde genommen besagt, dass sich alle drei Fragmente anfänglich im Container befinden würden, wobei Fragment C zu Beginn über a ausgeblendet wurdehide() Transaktionsvorgang. Wir dannshow() C undhide() Ein, wenn das UI-Ereignis eintritt. Ich verstehe jedoch nicht, wie das damit umgeht, dass B die Größe ändert. Es beruht auch auf der Tatsache, dass Sie anscheinend mehrere Fragmente zum selben Container hinzufügen können, und ich bin nicht sicher, ob dies langfristig ein verlässliches Verhalten ist oder nicht (ganz zu schweigen davon, dass es brechen solltefindFragmentById(), obwohl ich damit leben kann).

Der Autor vondieser Blogbeitrag zeigt an, dass Google Mail nicht verwendet wirdsetCustomAnimations() verwendet jedoch direkt Objektanimatoren ("Sie ändern nur den linken Rand der Stammansicht + die Breite der rechten Ansicht"). Dies ist jedoch immer noch eine AFAICT-Lösung mit zwei Fragmenten, und die gezeigte Implementierung verdrahtet erneut die Abmessungen in Pixeln.

Ich werde mich weiterhin damit abfinden, also werde ich vielleicht eines Tages selbst darauf antworten, aber ich hoffe wirklich, dass jemand die dreiteilige Lösung für dieses Animationsszenario ausgearbeitet hat und den Code (oder einen Link dazu) posten kann. Animationen in Android bringen mich dazu, mir die Haare auszureißen, und diejenigen von Ihnen, die mich gesehen haben, wissen, dass dies ein weitgehend erfolgloses Unterfangen ist.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage