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

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

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

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>  

Спасибо за вашу помощь


person Leguman    schedule 06.02.2015    source источник
comment
не могли бы вы прислать мне код этой анимации я уже давно пробую   -  person rajlaxmi_jagdale    schedule 25.02.2017


Ответы (12)


В выходящем действии вызовите getWindow().setExitTransition(null);

При входящем действии позвоните getWindow().setEnterTransition(null);

Это предотвратит постепенное исчезновение выходящей активности и постепенное появление входящей активности, что устраняет очевидный эффект мерцания.

person Kevin Lee    schedule 20.01.2016
comment
@АнантШах, ты мог бы. Почему бы не попробовать? Сначала вам нужны два действия. - person Kevin Lee; 08.09.2016
comment
@kevinze Спасибо. Это работало сейчас, прежде чем это не работало. один плюс с моей стороны. - person Anant Shah; 09.09.2016
comment
@sativa Сообщите нам больше информации, например, где вы назвали код, версию Android и т. д. - person Kevin Lee; 06.11.2016
comment
@KevinLee Я решил проблему, вызвав getWindow().setSharedElementsUseOverlay(true); - person sativa; 08.11.2016
comment
@sativa, getWindow().setSharedElementsUseOverlay(true); по умолчанию равно true, поэтому я не уверен, что это действительно что-то исправило ... - person Sakiboy; 28.02.2017
comment
Однако у него есть некоторые побочные эффекты, такие как черный фон, когда приложение закрывается системой. - person M. Reza Nasirloo; 28.04.2017
comment
он убирает эффект выцветания. это как подметать дело - person Mahdi Astanei; 19.01.2019
comment
@KevinLee, как мне назвать эти строки? Можете ли вы предоставить образец кода? - person blueware; 15.08.2020

Я решил эту проблему, изменив цвет фона моей темы по умолчанию, надеюсь, это все еще поможет кому-то сэкономить время.

<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
person Webdma    schedule 29.11.2015
comment
Я использовал @android:color/transparent благодаря этому вопросу, так как все остальные вызывали ошибки. Ваше здоровье! - person Josh Laird; 07.01.2017
comment
Ни один из ответов здесь не работает, кроме этого. Слава вам! - person 6rchid; 11.04.2020

«Белое мигание», которое вы видите, является результатом альфа-анимации двух действий во время перехода: когда действие A запускает действие B, действие A исчезает, а действие B постепенно появляется.

Если вы хотите предотвратить исчезновение строки состояния и/или панели навигации во время перехода (и, таким образом, немного уменьшить эффект «мигания»), вы можете посмотреть это сообщение.

person Alex Lockwood    schedule 18.02.2015
comment
Мне было интересно, не могли бы вы помочь мне с этим вопросом goo.gl/d5opg5 . Я обещаю, что это не один из тех вопросов «почини это для меня». - person Axel; 22.06.2015
comment
Пожалуйста, процитируйте соответствующую часть источника в своем ответе. - person Eugen Pechanec; 14.03.2017
comment
Действительно, вам нужно исключить строку состояния и панель навигации, спасибо, что указали на это! - person raquezha; 19.06.2021

Сделайте какой-нибудь метод в помощнике, например

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/

person Rzodkiewka    schedule 01.04.2016
comment
Как насчет устройств Nexus с панелью программных клавиш внизу? Каков идентификатор этой полосы, чтобы мы могли исключить ее из анимации? - person Abdul Samad; 15.11.2016

У меня были похожие проблемы с миганием, и я пробовал многие из примеров, упомянутых здесь, но для меня это не решило проблемы. Что сработало для меня, так это изменение фона окна для второй темы активности на прозрачный. (@Webdma использовал черный цвет, но в моем случае экран стал черным, а не белым)

    <item name="android:windowBackground">@android:color/transparent</item>
person Kasium    schedule 02.06.2017

У меня была похожая проблема. Я решил проблемы с мигающей строкой состояния и панелью навигации, исключив их из перехода в соответствии с предложением @Alex, но экран все еще мигал при переключении между действиями. Когда я удалил "finish();" оператор после startActivity(); экран перестал мигать. Возможно, это было связано с закрытием телефонной активности. Надеюсь, это поможет кому-то.

person Neanderthal    schedule 19.06.2015

Несколько полезных ответов выше. Насколько я понимаю, это вызвано перекрытием перехода активности. Чтобы решить эту проблему, я использовал следующие значения в методах onCreate() обоих действий:

getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
person Randeep    schedule 12.07.2017
comment
Ничего не сделал для меня - person Nexen; 04.03.2019

В моей ситуации у второго действия не было строки состояния, которая была определена в теме действия с этим тегом.

<item name="android:windowFullscreen">true</item>

Поскольку не было обязательным скрывать строку состояния в портретном режиме, я удалил этот тег и вручную скрыл/показал строку состояния, когда это необходимо, и мерцание исчезло.

person JDenais    schedule 24.01.2017

Добавьте эти коды в 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);

Это исключит анимацию из панели навигации и строки состояния, поэтому больше не будет мигать.

person Eldhopj    schedule 30.10.2018

Добавьте это в свой style.xml. Это предотвращает мигание экрана

    <item name="android:windowIsTranslucent">true</item>
person Rohan buddy    schedule 06.08.2019

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

В вашем конкретном случае я бы добавил панель инструментов и эти два представления в список общих элементов:

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());
person gatti    schedule 16.08.2016

В Java добавьте приведенную ниже строку в родительское действие после ActivityCompat.startActivity(activity,intent,options.toBundle());

getWindow().setExitTransition(null);

и добавьте строку ниже в метод onCreate дочерней активности

getWindow().setEnterTransition(null); 

В Kotlin добавьте строку ниже в родительскую активность

window.setExitTransition = null 

и добавьте строку ниже в метод onCreate дочерней активности

window.setEnterTransition = null
person md hasibul hasan    schedule 20.01.2021