Istnieją dwa znane mi podejścia, które pozwalają zapobiec animacji paska nawigacji / stanu podczas przejścia:
Podejście nr 1: Wyklucz pasek stanu i pasek nawigacji z domyślnego przejścia w oknie wyjścia / wejścia
Powodem, dla którego pasek nawigacji / stanu zanika i pojawia się podczas przejścia, jest to, że domyślnie wszystkie nieudostępnione widoki (w tym tła paska nawigacji / stanu) znikają / znikają w wywołanych / wywołanych działaniach odpowiednio po rozpoczęciu przejścia . Możesz jednak łatwo obejść ten problem, wykluczając tła paska nawigacji / stanu z domyślnego Fade
przejścia okna . Po prostu dodaj następujący kod do onCreate()
metod swoich działań :
Transition fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
To przejście można również zadeklarować w motywie działania za pomocą XML (tj. We własnym res/transition/window_fade.xml
pliku):
<?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>
Podejście nr 2: Dodaj pasek stanu i pasek nawigacji jako elementy wspólne
To podejście wywodzi się z odpowiedzi klmprt, która prawie mi się sprawdziła ... chociaż nadal potrzebowałem wprowadzić kilka modyfikacji.
W moim działaniu wywołującym użyłem następującego kodu, aby rozpocząć działanie:
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);
Jak dotąd jest to w zasadzie to samo, co sugerował klmprt w swojej odpowiedzi. Jednak musiałem również dodać następujący kod w mojej wywołanej onCreate()
metodzie Activity , aby zapobiec „miganiu” paska stanu i paska nawigacji podczas przejścia:
@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;
}
});
}
Dodanie paska stanu i tła paska nawigacji jako elementów współdzielonych wymusi ich rysowanie na górze domyślnego przejścia okna wyjściowego / wejścia, co oznacza, że nie będą one zanikać podczas przejścia. Więcej dyskusji na temat tego podejścia można znaleźć w tym poście Google+ .
Całkowicie zapobiegaj zakłócaniu przejść działań przez przejścia elementów współdzielonych:
Z https://stackoverflow.com/a/34907685/967131
Podejrzewam, że może to mieć skutki uboczne, ale nie wiem na pewno. To jest śmiertelnie proste i działa.
Zapobiegaj migotaniu określonych elementów:
Zacząłem od odpowiedzi Alexa Lockwooda i przeprowadziłem sporo eksperymentów, aby to zadziałało. Rdzeń jest poprawny, chociaż nie potrzebowałem kodu, który sugeruje dla działania odbierającego, ale napotkałem pewne problemy, wywołując go we fragmencie (zamiast działania) i ustawiając pasek narzędzi jako pasek akcji.
Och, sprawa Fragmentów? Widziałem wiele komentarzy, że próby pobrania odniesień do paska stanu i paska nawigacji były zerowe. To samo przydarzyło się mnie, dopóki nie zdałem sobie sprawy, że nie znajdę tych w układzie Fragmentu ... były powyżej tego poziomu. Stąd poniższy kod, aby uzyskać widok dekoru z działania i przeszukać go. Wtedy znalazłem je bez problemu.
Na koniec opracowałem tę metodę użytkową:
Uwaga R.string.transition_appbarlayout i R.id.appbarlayout . Te identyfikatory są dowolne, o ile są zgodne z tym, czego używa Twój kod. W moim XMLu układam niestandardowy pasek akcji w następujący sposób (zredagowany do podstawowych elementów):
Jeśli nie używasz takiego paska narzędzi, ta część może zostać usunięta z metody narzędzia.
Następnie nazwałbyś to w swoim fragmencie w ten sposób:
Używanie dowolnych wartości, o ile pasuje do twojego XML.
Zapobiega to miganiu paska stanu, paska narzędzi i paska nawigacji (przyciski Wstecz / Strona główna / Ostatnie aplikacje) podczas przejścia. Pozostała część przejścia aktywności jest normalna.
W moim przypadku motyw naszej aplikacji ma
android:windowBackground
kolor niebieski. Powoduje to niebieski błysk w przejściu, co jest dość frustrujące. Ale zamiast dokonywać zmiany, która ma wpływ na całą aplikację, na razie wybieram pierwszą, szybką i brudną opcję.źródło
Musisz je udostępnić
ActivityOptions.makeSceneTransitionAnimation.
Na przykład:
(przepraszam pseudo; nie mam dokładnej wartości android.R.id pod ręką)
Po udostępnieniu widoków możesz uruchomić odpowiednie przejście.
źródło
O ile rozumiem, jest to spowodowane nakładaniem się aktywności. Aby rozwiązać ten problem, zastosowałem następujące wartości w
onCreate()
metodach obu działań:źródło
Po prostu miałem ten sam problem i wydaje się, że w odpowiedziach brakuje kluczowego elementu układanki. Pamiętaj, że przy przejściu elementu współdzielonego wszystko dzieje się w działaniu docelowym .
Aby usunąć efekt flashowania, po prostu dodaj następujący wpis do wywoływanej czynności:
To powinno rozwiązać Twój problem!
źródło
getWindow().setEnterTransition(null);
w przejściu wchodzącym usunąłem dla mnie białą nakładkę.źródło
Oto jak to zrobiłem. Dzielę się zarówno z, jak
Status Bar
iNavigation Bar
wSharedElementTransition
wraz zImageView
:źródło