Verhindern Sie vollständig, dass Aktivitätsübergänge die Übergänge gemeinsamer Elemente stören:
Rufen Sie beim Beenden der Aktivität getWindow () auf. SetExitTransition (null);
Rufen Sie bei der Eingabe der Aktivität getWindow () auf. SetEnterTransition (null);
Von https://stackoverflow.com/a/34907685/967131
Ich vermute, dass dies Nebenwirkungen haben kann, weiß es aber nicht genau. Es ist kinderleicht und funktioniert trotzdem.
Verhindern Sie, dass bestimmte Elemente blinken:
Ich begann mit Alex Lockwoods Antwort und experimentierte ein bisschen, um sie zum Laufen zu bringen. Der Kern davon ist korrekt, obwohl ich den Code, den er für die empfangende Aktivität vorschlägt, nicht benötigte, aber ich stieß auf einige Probleme, indem ich ihn in einem Fragment (anstelle einer Aktivität) aufrief und eine Symbolleiste als Aktionsleiste festlegte.
Oh, das Fragment-Ding? Ich habe viele Kommentare gesehen, dass der Versuch, Verweise auf die Statusleiste und die Navigationsleiste abzurufen, null war. Das gleiche passierte mir auch, bis mir klar wurde, dass ich diese im Layout des Fragments nicht finden würde ... sie lagen über diesem Niveau. Daher den folgenden Code, um die Dekoransicht aus der Aktivität abzurufen und diese zu durchsuchen. Dann fand ich sie ohne Probleme.
Am Ende habe ich diese Dienstprogrammmethode entwickelt:
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();
}
Beachten Sie R.string.transition_appbarlayout und R.id.appbarlayout . Diese IDs sind beliebig, solange sie mit dem übereinstimmen, was Ihr Code verwendet. In meinem XML gestalte ich die benutzerdefinierte Aktionsleiste wie folgt (bis auf das Wesentliche bearbeitet):
<?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>
Wenn Sie eine solche Symbolleiste nicht verwenden, kann dieser Teil aus der Dienstprogrammmethode entfernt werden.
Dann würden Sie es in Ihrem Fragment so nennen:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
Verwenden Sie die gewünschten Werte, sofern diese mit Ihrem XML übereinstimmen.
Dadurch wird verhindert, dass die Statusleiste, die Symbolleiste und die Navigationsleiste (Schaltflächen Zurück / Startseite / Letzte Apps) während des Übergangs blinken. Der Rest des Aktivitätsübergangs ist normal.
In meinem Fall hat unser App-Thema ein android:windowBackground
Blau. Dies verursacht einen blauen Blitz im Übergang, was ziemlich frustrierend ist. Aber anstatt eine Änderung vorzunehmen, die sich auf die gesamte App auswirkt, gehe ich jetzt zur ersten, schnellen und schmutzigen Option.