Мигающий экран при переходе изображения между действиями
Я реализовал переход изображений между двумя действиями, используя новые общие элементы из леденца на палочке. Это работает, но я получаю странное белое мигание на весь экран во время перехода, и я не могу найти, как от него избавиться. Вот пример:
Вот как запускается вторая активность
public static void launch(
@NonNull Activity activity, @NonNull View transitionView, Game game) {
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, transitionView, game.gameFullId);
Intent intent = new Intent(activity, ListImportationLoginActivity.class);
intent.putExtra(INTENT_EXTRA_GAME, retailer);
ActivityCompat.startActivity(activity, intent, options.toBundle());
}
Тогда в onCreate:
ViewCompat.setTransitionName(mLogoView, mGame.gameFullId);
И файл темы:
<resources>
<style name="Theme.MyApp.NoActionBar" parent="Theme.MyApp.NoActionBar.Base">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>
</style>
</resources>
Спасибо за вашу помощь
13 ответов
По выходной активности звонитеgetWindow().setExitTransition(null);
По входящей деятельности звонитеgetWindow().setEnterTransition(null);
Это предотвратит исчезновение выходящей активности и появление входящей активности, что устраняет видимый эффект мигания.
Я решил эту проблему, изменив цвет фона моей темы по умолчанию, надеюсь, это все же поможет кому-то сэкономить время.
<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
"Мигающее белое", которое вы видите, является результатом двух активностей альфа-анимации во время перехода: когда активность A
начинает деятельность B
, деятельность A
затухает и активность B
исчезает
Если вы хотите предотвратить исчезновение строки состояния и / или панели навигации во время перехода (и, таким образом, немного уменьшить эффект "мерцания"), вы можете посмотреть этот пост.
Сделайте какой-нибудь метод в помощнике, как
public static Transition makeEnterTransition() {
Transition fade = new Fade();
fade.excludeTarget(android.R.id.navigationBarBackground, true);
fade.excludeTarget(android.R.id.statusBarBackground, true);
return fade;
}
Выполните это в действии, которое вы начинаете, как это
getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());
Источник https://github.com/alexjlockwood/custom-lollipop-transitions/
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>
У меня были похожие проблемы с миганием, и я пробовал многие примеры, упомянутые здесь, но для меня это не решило проблемы. Для меня сработало изменение фона окна для второй темы занятия на прозрачный. (@Webdma использовал черный цвет, но в моем случае экран стал черным вместо белого)
<item name="android:windowBackground">@android:color/transparent</item>
Добавьте это в свой style.xml. Это предотвращает мигание экрана.
<item name="android:windowIsTranslucent">true</item>
Некоторые полезные ответы выше. Насколько я понимаю, это связано с перекрытием перехода деятельности. Чтобы преодолеть эту проблему, я использовал следующие значения в onCreate()
методы обоих видов деятельности:
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
У меня была похожая проблема. Я решил проблемы с мигающей строкой состояния и навигационной панелью, исключив их из перехода в соответствии с предложением @Alex, но экран все еще мигал при переключении между действиями. Когда я удалил "finish();" оператор после startActivity(); экран перестал мигать. Возможно, это было связано с закрытием колл-активности. Надеюсь, это кому-нибудь поможет.
Добавьте эти коды внутри onCreate обеих операций, где вы делаете элементы перехода
Fade fade = new Fade();
View decor = getWindow().getDecorView();
fade.excludeTarget(decor.findViewById(R.id.action_bar_container),true);
fade.excludeTarget(android.R.id.statusBarBackground,true);
fade.excludeTarget(android.R.id.navigationBarBackground,true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
Это исключит анимацию из навигации и строки состояния, так что больше не будет мигать
В моей ситуации у второго действия не было строки состояния, которая была определена в теме действия с этим тегом.
<item name="android:windowFullscreen">true</item>
Поскольку не было необходимости скрывать строку состояния в портретном режиме, я удалил этот тег и вручную скрыл / отобразил строку состояния, когда это необходимо, и мигание исчезло.
Элементы появляются и исчезают, если вы явно не укажете, что они одинаковы для обеих операций. Это включает в себя статус и панель навигации.
В вашем конкретном случае я бы добавил панель инструментов и эти два представления в список общих элементов:
List<Pair> viewPairs = new ArrayList<>();
viewPairs.add(Pair.create(findViewById(android.R.id.statusBarBackground), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
viewPairs.add(Pair.create(findViewById(android.R.id.navigationBarBackground), Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
// Add your views...
Pair[] array = new Pair[viewPairs.size()];
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), viewPairs.toArray(array)).toBundle();
// ...
ActivityCompat.startActivity(activity, intent, options.toBundle());
В Java добавьте приведенную ниже строку в родительское действие после ActivityCompat.startActivity(activity,intent,options.toBundle());
getWindow().setExitTransition(null);
и добавьте строку ниже в метод onCreate дочерней активности
getWindow().setEnterTransition(null);
В Kotlin добавьте строку ниже в родительскую активность
window.setExitTransition = null
и добавьте строку ниже в метод onCreate дочерней активности
window.setEnterTransition = null