Мигающий экран перехода изображения между действиями
Я реализовал переход изображения между двумя действиями, используя новые общие элементы из lollipop. Он работает, но во время перехода я получаю странное белое мигание на весь экран, и я не могу найти, как избавиться от него. Вот пример:
![Status bar also blinking]()
Вот как запускается второе действие
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>
Спасибо за помощь
Ответы
Ответ 1
"Белое мигание", которое вы видите, является результатом двух действий альфа-анимации внутри и снаружи во время перехода: когда активность A
начинает активность B
, активность A
исчезает и активность B
исчезает.
Если вы хотите, чтобы строка состояния и/или панель навигации не исчезали во время перехода (и, следовательно, немного уменьшали "мерцающий" эффект), вы можете посмотреть этот пост.
Ответ 2
В процессе выхода вызовите
getWindow().setExitTransition(null);
При вводе активности вызовите
getWindow().setEnterTransition(null);
Это предотвратит постепенное исчезновение выходящей активности и исчезновение входящей активности, которая устраняет кажущийся мигающий эффект.
Ответ 3
Я решил эту проблему, изменив цвет фона моей темы по умолчанию, надеюсь, что это все равно может помочь кому-то сэкономить время.
<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
Ответ 4
Сделайте некоторый метод в помощнике, например
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/
Ответ 5
У меня были похожие мигающие проблемы и многие из приведенных здесь примеров, но для меня это не решило проблемы. Что для меня работало, так это изменение фона окна для второй темы активности для прозрачности. (@Webdma используется черным, но в моем случае это сделало экран черным, а не белым)
<item name="android:windowBackground">@android:color/transparent</item>
Ответ 6
У меня была аналогичная проблема.
Я решил мигать строка состояния и панель навигации, исключив их из перехода в соответствии с предложением @Alex, но экран все еще мигал при переключении между действиями. Когда я удалил
"Конец();" утверждение после startActivity(); экран перестает мигать.
Возможно, это было связано с закрытием вызывающей деятельности. Надеюсь, это поможет кому-то.
Ответ 7
В моей ситуации второе действие не имело строки состояния, которая была определена в теме действия с этим тегом.
<item name="android:windowFullscreen">true</item>
Так как не было необходимости скрывать строку состояния в портретном режиме, я удалял этот тег и вручную скрывал/показывал строку состояния, когда это было необходимо, и мигание исчезло.
Ответ 8
Некоторые полезные ответы выше.
Насколько я понимаю, это связано с перекрытием переходов. Чтобы преодолеть эту проблему, я использовал следующие значения в методах onCreate()
для обоих видов деятельности:
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
Ответ 9
Элементы исчезают и исчезают, если вы не укажете явно, что они одинаковы для обоих видов деятельности. Это включает в себя статус и панель навигации.
В вашем конкретном случае я бы добавил панель инструментов и эти два представления в список общих элементов:
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());