TL; DR: Sto cercando un esempio completo di funzionamento di quello che chiamerò scenario "l'animazione a tre frammenti di Gmail". In particolare, vogliamo iniziare con due frammenti, in questo modo:
In occasione di un evento dell'interfaccia utente (ad esempio, toccando qualcosa nel frammento B), vogliamo:
- Frammento A per scorrere fuori dallo schermo a sinistra
- Frammento B per scorrere verso il bordo sinistro dello schermo e ridursi per occupare il punto lasciato libero dal frammento A
- Frammento C per scorrere dal lato destro dello schermo e occupare il posto lasciato libero dal frammento B
E, premendo un pulsante INDIETRO, vogliamo che tale serie di operazioni sia invertita.
Ora ho visto molte implementazioni parziali; Ne esaminerò quattro di seguito. Oltre ad essere incompleti, hanno tutti i loro problemi.
@Reto Meier ha contribuito con questa popolare risposta alla stessa domanda di base, indicando che avresti usato setCustomAnimations()
con a FragmentTransaction
. Per uno scenario a due frammenti (ad esempio, inizialmente vedi solo il frammento A e vuoi sostituirlo con un nuovo frammento B usando effetti animati), sono completamente d'accordo. Però:
- Dato che puoi specificare solo un'animazione "in" e una "out", non riesco a vedere come gestiresti tutte le diverse animazioni richieste per lo scenario a tre frammenti
- Nel
<objectAnimator>
suo codice di esempio utilizza posizioni cablate in pixel e ciò sembrerebbe poco pratico date le dimensioni dello schermo variabili, tuttaviasetCustomAnimations()
richiede risorse di animazione, precludendo la possibilità di definire queste cose in Java - Sono in perdita su come gli animatori di oggetti per la scala si collegano a cose come
android:layout_weight
in unaLinearLayout
allocazione dello spazio su base percentuale - Sono ad una perdita su come frammento C viene gestita, in via preliminare (
GONE
?android:layout_weight
Di0
? Pre-animato per una scala da 0? Qualcos'altro?)
@Roman Nurik sottolinea che puoi animare qualsiasi proprietà , comprese quelle che definisci tu stesso. Ciò può aiutare a risolvere il problema delle posizioni cablate, a costo di inventare la propria sottoclasse del gestore di layout personalizzato. Questo aiuta alcuni, ma sono ancora sconcertato dal resto della soluzione di Reto.
L'autore di questa voce pastebin mostra alcuni pseudocodici allettanti, sostanzialmente dicendo che tutti e tre i frammenti risiederebbero inizialmente nel contenitore, con il frammento C nascosto all'inizio tramite un'operazione di hide()
transazione. Abbiamo quindi show()
C e hide()
A quando si verifica l'evento UI. Tuttavia, non vedo come ciò gestisca il fatto che B cambi dimensioni. Si basa anche sul fatto che apparentemente è possibile aggiungere più frammenti allo stesso contenitore e non sono sicuro che si tratti di un comportamento affidabile a lungo termine (per non parlare del fatto che dovrebbe rompersi findFragmentById()
, anche se posso conviverci).
L'autore di questo post sul blog indica che Gmail non utilizza setCustomAnimations()
affatto, ma utilizza direttamente direttamente gli animatori di oggetti ("basta cambiare il margine sinistro della vista radice + cambiare la larghezza della vista destra"). Tuttavia, questa è ancora una soluzione AFAICT a due frammenti e l'implementazione ha mostrato ancora una volta le dimensioni dei fili rigidi in pixel.
Continuerò a collegarmi a questo, quindi un giorno potrei finire per rispondere a questa domanda, ma spero davvero che qualcuno abbia elaborato la soluzione a tre frammenti per questo scenario di animazione e possa pubblicare il codice (o un link ad esso). Le animazioni in Android mi fanno venir voglia di togliermi i capelli e quelli di voi che mi hanno visto sanno che si tratta di uno sforzo ampiamente inutile.