Całkowicie zapobiegaj zakłócaniu przejść działań przez przejścia elementów współdzielonych:
W przypadku wychodzącego działania wywołaj getWindow (). SetExitTransition (null);
Na wprowadzanej czynności wywołaj getWindow (). SetEnterTransition (null);
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ą:
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();
}
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):
<?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>
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:
startActivity(intent, UIUtils.transitionOptions(getActivity(),
R.id.**my_view**,
R.string.**transition_my_view**));
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ę.