Es gibt zwei mir bekannte Ansätze, um zu verhindern, dass die Navigations- / Statusleiste während des Übergangs animiert wird:
Ansatz 1: Schließen Sie die Statusleiste und die Navigationsleiste vom Standardübergang zum Beenden / Eingeben des Fensters aus
Der Grund, warum die Navigations- / Statusleiste während des Übergangs ein- und ausgeblendet wird, liegt darin, dass standardmäßig alle nicht freigegebenen Ansichten (einschließlich der Hintergründe der Navigations- / Statusleiste) in Ihren aufrufenden / angerufenen Aktivitäten ausgeblendet werden, sobald der Übergang beginnt . Sie können dies jedoch leicht umgehen, indem Sie die Hintergründe der Navigations- / Statusleiste vom Standardübergang zum Beenden / Eingeben des Fensters ausschließen Fade
. Fügen Sie einfach den folgenden Code zu den onCreate()
Methoden Ihrer Aktivitäten hinzu :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
Dieser Übergang kann auch im Thema der Aktivität mithilfe von XML deklariert werden (dh in Ihrer eigenen res/transition/window_fade.xml
Datei):
<?xml version="1.0" encoding="utf-8"?>
<fade xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
</targets>
</fade>
Ansatz 2: Fügen Sie die Statusleiste und die Navigationsleiste als gemeinsam genutzte Elemente hinzu
Dieser Ansatz baut auf der Antwort von klmprt auf, die für mich fast funktioniert hat ... obwohl ich noch einige Änderungen vornehmen musste.
In meiner aufrufenden Aktivität habe ich den folgenden Code verwendet, um die Aktivität zu starten:
View statusBar = findViewById(android.R.id.statusBarBackground);
View navigationBar = findViewById(android.R.id.navigationBarBackground);
List<Pair<View, String>> pairs = new ArrayList<>();
if (statusBar != null) {
pairs.add(Pair.create(statusBar, Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
}
if (navigationBar != null) {
pairs.add(Pair.create(navigationBar, Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
}
pairs.add(Pair.create(mSharedElement, mSharedElement.getTransitionName()));
Bundle options = ActivityOptions.makeSceneTransitionAnimation(activity,
pairs.toArray(new Pair[pairs.size()])).toBundle();
startActivity(new Intent(context, NextActivity.class), options);
Bisher ist dies im Wesentlichen dasselbe, was klmprt in seiner Antwort vorgeschlagen hat. Ich musste jedoch auch den folgenden Code in die onCreate()
Methode meiner aufgerufenen Aktivität einfügen, um zu verhindern, dass die Statusleiste und die Navigationsleiste während des Übergangs "blinken":
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
// Postpone the transition until the window's decor view has
// finished its layout.
postponeEnterTransition();
final View decor = getWindow().getDecorView();
decor.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
decor.getViewTreeObserver().removeOnPreDrawListener(this);
startPostponedEnterTransition();
return true;
}
});
}
Durch Hinzufügen der Statusleiste und der Hintergründe der Navigationsleiste als gemeinsam genutzte Elemente werden sie über den Standardübergang zum Beenden / Eingeben des Fensters gezeichnet, was bedeutet, dass sie während des Übergangs nicht ausgeblendet werden. Weitere Informationen zu diesem Ansatz finden Sie in diesem Google+ Beitrag .
Verhindern Sie vollständig, dass Aktivitätsübergänge die Übergänge gemeinsamer Elemente stören:
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:
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):
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:
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.quelle
Sie müssen sie teilen
ActivityOptions.makeSceneTransitionAnimation.
Z.B:
(Entschuldigen Sie das Pseudo; ich habe nicht den genauen Wert für android.R.id zur Hand)
Sie können einen entsprechenden Übergang ausführen, nachdem Sie die Ansichten freigegeben haben.
quelle
Soweit ich weiß, wird dies durch Überschneidungen des Aktivitätsübergangs verursacht. Um dieses Problem zu beheben, habe ich in den
onCreate()
Methoden beider Aktivitäten die folgenden Werte verwendet :quelle
Ich hatte gerade das gleiche Problem und den Antworten scheint ein kritischer Teil des Puzzles zu fehlen. Denken Sie daran, dass bei einem Übergang mit gemeinsam genutzten Elementen alles in der Zielaktivität geschieht .
Um den Blitzeffekt zu entfernen, fügen Sie der aufgerufenen Aktivität einfach Folgendes hinzu:
Dies sollte Ihr Problem lösen!
quelle
getWindow().setEnterTransition(null);
Beim Übergang Eingabe wurde die weiße Überlagerung für mich entfernt.quelle
Hier ist, wie ich es gemacht habe. Ich teile sowohl das
Status Bar
als auch dasNavigation Bar
in derSharedElementTransition
zusammen mit einemImageView
:quelle