Мигающий экран при переходе изображения между действиями

Я реализовал переход изображений между двумя действиями, используя новые общие элементы из леденца на палочке. Это работает, но я получаю странное белое мигание на весь экран во время перехода, и я не могу найти, как от него избавиться. Вот пример:Строка состояния также мигает

Вот как запускается вторая активность

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
Другие вопросы по тегам