Impedisci completamente alle transizioni delle attività di interferire con le transizioni degli elementi condivisi:
Sull'attività in uscita, chiamare getWindow (). SetExitTransition (null);
Sull'attività di immissione, chiamare getWindow (). SetEnterTransition (null);
Da https://stackoverflow.com/a/34907685/967131
Sospetto che ciò possa avere effetti collaterali, ma non lo so per certo. È morto semplice e funziona però.
Impedire a elementi specifici di lampeggiare:
Ho iniziato con la risposta di Alex Lockwood e ho fatto un bel po 'di sperimentazione per cercare di farlo funzionare. Il nucleo è corretto, anche se non avevo bisogno del codice che suggerisce per l'attività di ricezione, ma ho riscontrato alcuni problemi chiamandolo in un frammento (anziché un'attività) e impostando una barra degli strumenti come barra delle azioni.
Oh, la cosa dei frammenti? Ho visto molti commenti secondo cui il tentativo di recuperare riferimenti alla barra di stato e alla barra di navigazione era nullo. La stessa cosa è successa anche a me, fino a quando ho capito che non avrei trovato quelli nel layout del frammento ... erano al di sopra di quel livello. Quindi, il codice qui sotto per ottenere la vista decor dall'attività e cercarlo. Poi li ho trovati senza problemi.
Alla fine, ho sviluppato questo metodo di utilità:
public static Bundle transitionOptions(Activity activity, int transitionViewResId, int transitionNameResId) {
if (VERSION.SDK_INT < VERSION_CODES.LOLLIPOP) {
return null;
}
View decorView = activity.getWindow().getDecorView();
View statusBar = decorView.findViewById(android.R.id.statusBarBackground);
View navigationBar = decorView.findViewById(android.R.id.navigationBarBackground);
View appBarLayout = decorView.findViewById(**R.id.appbarlayout**);
View transitionView = decorView.findViewById(transitionViewResId);
String transitionName = activity.getString(transitionNameResId);
List<Pair<View, String>> pairs = new ArrayList<>();
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
if (appBarLayout != null) {
pairs.add(Pair.create(appBarLayout, activity.getString(**R.string.transition_appbarlayout**)));
}
pairs.add(Pair.create(transitionView, transitionName));
//noinspection unchecked - we're not worried about the "unchecked" conversion of List<Pair> to Pair[] here
return ActivityOptionsCompat.makeSceneTransitionAnimation(activity, pairs.toArray(new Pair[pairs.size()]))
.toBundle();
}
Nota R.string.transition_appbarlayout e R.id.appbarlayout . Questi ID sono arbitrari, purché corrispondano a ciò che utilizza il tuo codice. Nel mio XML, layout la barra delle azioni personalizzata in questo modo (modificata fino all'essenziale):
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.AppBarLayout
android:id="**@+id/appbarlayout**"
android:transitionName="**@string/transition_appbarlayout**">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"/>
</android.support.design.widget.AppBarLayout>
Se non si utilizza una barra degli strumenti come questa, quella parte può essere rimossa dal metodo di utilità.
Quindi lo chiameresti nel tuo frammento in questo modo:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
Usando qualunque valore tu voglia, purché corrisponda al tuo XML.
Questo impedisce alla barra di stato, alla barra degli strumenti e alla barra di navigazione (pulsanti indietro / home / app recenti) di lampeggiare durante la transizione. Il resto della transizione Attività è normale.
Nel mio caso, il tema della nostra app ha un android:windowBackground
colore blu. Ciò provoca un lampo blu nella transizione, il che è abbastanza frustrante. Ma piuttosto che apportare una modifica che influisce sull'intera app in questo modo, per ora vado con la prima opzione, veloce e sporca.