19

Sto tentando di animare 2 viste semplici da un elemento selezionato in un RecyclerView a un nuovo frammento. Ho esaminato molti esempi di animazione di elementi condivisi da un'attività a un'altra attività, ma pochissimi esempi di animazione di un elemento condiviso da un frammento a un altro frammento all'interno della stessa attività. Funziona quasi.Elementi condivisi che animano tra i frammenti

Ecco la mia struttura.

Attività

- Fragment1 schermo intero con RecyclerView

- Fragment2 schermo intero con dettagli

Quando l'utente seleziona un elemento della RecyclerView in Fragment1, sostituisco Fragment1 con Fragment2 che ha una vista con gli elementi condivisi in essa in diverse posizioni e dimensioni.

C'è un trucchetto per farlo funzionare, devi assicurarti che il tuo nome di transizione sia univoco per ogni elemento nel tuo elenco, e naturalmente che transitionName deve corrispondere al nome di transizione dell'elemento in Fragment2 per l'animazione a giocare. Ho questa parte funzionante, quando seleziono un oggetto, le 2 viste condivise si animano, solo non esattamente come ci si aspetterebbe nel farlo tra 2 attività.

Se seleziono un elemento nella parte inferiore dello schermo, disegna la vista per Fragment2 e anima le 2 viste condivise come se fossero nell'elemento nella parte superiore dello schermo. Difficile da spiegare. Ecco alcune immagini

Fragment1 Select item near bottom of list

Fragment2 I would expect the blue line to animate from the bottom to the top, but it starts at the top and only grows horizontaly, the yellow line I would expect to stay near the bottom but grow horizontally, but it starts at the top of the screen and animates down

In entrambi i frammenti sto impostando la seguente

 setSharedElementEnterTransition(new ChangeBounds()); 
     setSharedElementReturnTransition(new ChangeBounds()); 
     setAllowEnterTransitionOverlap(true); 
     setAllowReturnTransitionOverlap(true); 

anche nella loro attività principale in onCreate() ho set

 getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS); 

Qualche idea sul perché le mie animazioni di elementi condivise inizino nella parte superiore del mio schermo anche quando sono state avviate nell'elemento selezionato nella parte inferiore dello schermo?

+0

io non sono sicuro di capire ciò che si sta cercando di ottenere. Immagino che le strane barre gialle/blu siano le viste a cui ti riferisci? Quindi nel tuo primo screenshot fai clic sull'elemento e ti aspetti che le due corrispondenti barre giallo/blu si animino nelle posizioni delle barre giallo/blu nel secondo frammento ... ma cosa succede invece? Cosa intendi "...disegna la vista per Fragment2 e anima le 2 viste condivise come se fossero nell'elemento nella parte superiore dello schermo "? Inoltre, cosa rappresentano le frecce nel secondo screenshot? –

+0

BTW, se usi Android Studio, puoi facilmente acquisire una schermata della tua applicazione (consulta [** queste istruzioni **] (https://developer.android.com/sdk/installing/studio-debug.html#screenCap)) e caricala su YouTube (I conoscere la spiegazione del problema deve essere difficile) –

+0

Un'ultima domanda: questo comportamento si verifica _only_ quando si selezionano gli elementi nella parte inferiore dello schermo? Ad esempio, funzionerà come previsto per gli elementi nella parte superiore? –

risposta

35

Finalmente risolto questo problema! Come risulta perché la vista che sto condividendo tra 2 frammenti è figlia di un'altra vista (RelativeLayout) nel 2 ° frammento, devi aggiungere la transizione ChangeTransform al tuo TransitionSet. Apparentemente ChangeTransform dice al sistema di ricordare la posizione originale delle viste nel 1 ° frammento prima di animare alla nuova posizione nel 2 ° frammento. Ecco la mia transizione aggiornata. Pulirò un po 'anche il codice del mio progetto di test e daremo una spinta finale a bitbucket nel caso in cui aiuti gli altri dopo di me. Grazie per tutto l'aiuto con questo Alex e grazie a @ George-mount per aver risposto a una domanda simile a qualcuno che mi ha lasciato il suggerimento per questa soluzione.

<?xml version="1.0" encoding="utf-8"?> 

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 
    <changeTransform/> 
    <changeBounds/> 
</transitionSet> 

https://bitbucket.org/brockoli/fragmentsharedelements

+0

Huh ... wow. Sono contento che tu l'abbia finalmente capito. Sicuramente non mi aspettavo che fosse la soluzione. :) –

+0

funziona, hai risparmiato un sacco di tempo per me :) –

+0

dopo ore di scavare, questo lo ha risolto. Grazie per la condivisione! –

Problemi correlati