2016-04-30 14 views
12

Si prega di guardare questo video che mostra una transizione di attività elementi condivisa. È una transizione da un'attività elenco ad un'attività dettaglio.Transizione elemento condiviso Android: la vista dell'eroe viene disegnata davanti agli altri

[link del video non funziona più]

Come si può vedere l'imageview viene disegnato davanti alle schede.

Quello che mi aspetterei è che le schede vengano disegnate nel carattere sull'immagini e si dissolvono durante la transizione (in modo che alla fine dell'animazione siano scomparse).

L'unica cosa che sembra funzionare è impostare windowSharedElementsUseOverlay su true, ma questo ha altri effetti brutti, quindi sembra non essere un'opzione.

L'approccio più comunemente suggerito è quello di includere le schede nella transizione stessa, ma il problema è che le schede non sono presenti nell'attività di dettaglio in modo che non possano essere condivise.


Codice: comincio l'attività particolare come questo:

options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs); 
ActivityCompat.startActivity(activity, subActivity, options.toBundle()); 
+0

Ti capita di avere un'elevazione impostata da qualche parte nel tuo stile? Uno dei motivi per cui le viste appaiono sopra l'una sopra l'altra è quando viene impostata un'elevazione. –

+0

Ho risolto questo problema scorrendo leggermente il mio 'RecyclerView' verso il basso quando si fa clic sull'elemento, quindi la vista non è ostruita da' ActionBar'/'Toolbar', quindi eseguendo la transizione una volta terminato l'evento di scorrimento. Non ideale, ma sembra bello e fa il lavoro. La complessità era nel determinare quanto scorrere in basso, in base a quanto della vista era ostruita. –

+0

@SimonGuerout ringrazia Simon, ha provato a rimuovere tutte le animazioni, nessun successo: - ((( –

risposta

0

Si dovrebbe provare questo:.

Sulla attività di uscire, chiamare getWindow setExitTransition (null)();

Sull'attività di immissione, chiamare getWindow(). SetEnterTransition (null);

Impedirà l'attenuazione dell'attivitā di uscita e la dissolvenza in entrata dell'attività di immissione, che rimuove l'effetto lampeggiante apparente e rende la transizione uniforme.

+0

Grazie Sandip, non funziona :-( –

2

Credo che quello che potrebbe essere necessario è escludere, piuttosto che includere, il layout delle schede dall'animazione di transizione.

Così, alla onCreate della vostra attività lista, includere:

Transition fade = new Fade(); 
fade.excludeTarget(R.id.tab, true); // use appropriate id for you tab 
getWindow().setExitTransition(fade); 
getWindow().setEnterTransition(fade); // try getWindow().setReenterTransition(fade); instead 

hanno sicuramente un'occhiata alla risposta di Alex Lockwood per How do I prevent the status bar and navigation bar from animating during an activity scene animation transition? dove dà una spiegazione maggiore e più approfondita, ma digeribile sul tema. Si potrebbe anche voler considerare l'aggiunta/implementazione della soluzione in quel post.

+0

Grazie ade, che non funziona. Non sono sicuro di aver capito il tuo punto: tu suggerisci per escludere dalla transizione dell'attività di dettaglio le schede, ma esse appartengono all'attività principale (e non esistono nell'attività di dettaglio) –

+0

Il framework delle transizioni si rivolge a 2 tipi: transizioni di contenuto e transizioni di elementi condivisi. la scheda è un elemento non condiviso, quindi ciò che si desidera/deve controllare è l'uscita e il rientro degli elementi non condivisi dell'elenco/attività principale, ovvero la scheda. Questo è ciò che il codice sopra tenta di fare. –

1

La mia attività di chiamata ha sia un tablayout che una barra degli strumenti all'interno e ogni volta che ho effettuato la transizione, l'immagine appare in cima a tablayout e barra degli strumenti, rendendo la transizione disordinata.

Ho risolto il problema in modo abbastanza elegante aggiungendo solo un "fittizio" tablayout e una barra "fittizia" nella mia attività chiamata. Gli elementi "virtuali" non sono visibili in modo che non influisce il layout della mia chiamata attività, ma l'effetto di transizione funzionerà correttamente se vengono aggiunti in.

   <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar2" 
        android:transitionName="toolbar" 
        android:visibility="gone" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" /> 

       <android.support.design.widget.TabLayout 
        android:id="@+id/sliding_tabs" 
        android:layout_width="match_parent" 
        android:layout_height="60dp" 
        android:visibility="gone" 
        android:transitionName="tab" 
        ></android.support.design.widget.TabLayout> 

Ho poi aggiunto il tablayout e la barra degli strumenti come coppia nella mia transizione:

 Pair<View, String> p4 = Pair.create(getActivity().findViewById(R.id.sliding_tabs), "tab"); 
     Pair<View, String> p5 = Pair.create(getActivity().findViewById(R.id.toolbar), "toolbar"); 
     Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), p1, p2, p3, p4, p5).toBundle(); 
Problemi correlati