Подтвердить что ты не робот

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

Я реализовал переход изображения между двумя действиями, используя новые общие элементы из 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>  

Спасибо за помощь

4b9b3361

Ответ 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());