risposta

10

È possibile.

Innanzitutto, quando si rileva nel proprio frammento che la transizione sta per accadere, creare un array di Pair<View, String> che si popola con il nome di visualizzazione e di transizione.

Per esempio, se si desidera animare un'immagine in miniatura da l'immagine alla massima larghezza:

Pair[] pairs = new Pair[1]; 
    pairs[0] = new Pair(thumbnailImage, "THUMBNAIL_IMAGE"); 

In secondo luogo, tale matrice passare all'attività del frammento in modo che possa iniziare l'effettiva transizione. (Sto usando Otto per passare quell'evento, puoi usare i normali callback se vuoi).

Quindi, nella tua attività, inizia la seconda attività. (Ho creato un metodo semplice per farlo)

public static void transitionExpand(Activity activity, Intent intent, Pair<View, String>[] sharedElements) { 
     ActivityOptionsCompat options = 
      ActivityOptionsCompat.makeSceneTransitionAnimation(activity, sharedElements); 

     ActivityCompat.startActivity(activity, intent, options.toBundle()); 
} 

Nella seconda attività, è possibile aggiungere il frammento nel solito modo. Poi, nel secondo metodo di frammento onViewCreated(), è possibile chiamare:

ViewCompat.setTransitionName(fullWidthImage, "THUMBNAIL_IMAGE"); 

spero che aiuta

+0

Non funziona ... dovrei usare anche addSharedElement (Visualizza sharedElement, String name)? Nell'attività chiamata, ho un frammento con un cercapersone e un frammento. Potrebbe essere il problema? – Matroska

+0

no. quale versione del sistema operativo stai provando? –

+0

Android Lollipop. – Matroska

1

UPDATE: Come di v25.1.1 of the support library, questi stessi metodi sono nei frammenti di supporto. Link ai documenti: Fragment.postponeEnterTransition() e Fragment.startPostponedEnterTransition()

RISPOSTA ORIGINALE:

E 'possibile, anche con un dinamicamente aggiunto Frammento nella seconda attività.

Hai solo bisogno di dire alla seconda attività di non eseguire le animazioni di transizione fino a quando gli elementi condivisi non sono stati disposti e misurati.

Nel onCreate della seconda chiamata di attività postponeEnterTransition() (o supportPostponeEnterTransition() se si utilizza la libreria di supporto). Aggiungi dinamicamente il tuo frammento a questa attività. Alla fine del metodo onCreateView nel frammento che stai aggiungendo dinamicamente, chiama getActivity().startPostponedEnterTransition().

Questo ovviamente presuppone che tu abbia fatto tutto il necessario per una transizione di elementi condivisa, ma credo che questi metodi siano ciò che stai cercando con la tua domanda.

Credito a @ alex-lockwood's blog per avermi mostrato la luce.

Problemi correlati