Кто-нибудь еще заметил белый экран, который создает переход с окна слайда при его запуске?

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

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

Есть ли способ удалить это?

Код, который устанавливает переход ввода для второго действия:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = activity.getWindow();

        Slide slide = new Slide();
        slide.setSlideEdge(Gravity.RIGHT);
        slide.excludeTarget(android.R.id.statusBarBackground, true);
        slide.excludeTarget(android.R.id.navigationBarBackground, true);
        window.setEnterTransition(slide);
        window.setExitTransition(slide);
    }

Мои стили

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowActivityTransitions">true</item>
    <item name="android:windowContentTransitions">true</item>
    <item name="android:windowAllowEnterTransitionOverlap">false</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden|adjustResize</item>
</style>

Ответ 1

Как исправить белый экран во время перехода слайда для начатого действия:

karaokyos отвечает использует pre Lollipop переходы активности. Эти переходы нацелены на весь экран активности и не предоставляют возможности для исключения частей экрана во время перехода.

Подход Джона Эрнеста Гвадалупе использует переходы, введенные в Lollipop (Активность и фрагментарные переходы). Наблюдаемый "белый экран" - это фон окна, который исчезает во время перехода (больше информации о переходах активности и фрагментов). Думаю, вы устанавливаете "черный фон" ваших действий в корневом представлении вашего макета? Установка фона окна на черный цвет должна решить вашу проблему.

Программный:

window.setBackgroundDrawable(new ColorDrawable(Color.BLACK));

Тема:

<item name="android:windowBackground">@android:color/black</item>

Это результирующий переход.

Результирующий переход

Изменить: как обеспечить необходимый переход (слева) для вызывающей активности

Первая активность:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    Slide slide = new Slide();
    slide.setInterpolator(new LinearInterpolator());
    slide.setSlideEdge(Gravity.LEFT);
    slide.excludeTarget(android.R.id.statusBarBackground, true);
    slide.excludeTarget(android.R.id.navigationBarBackground, true);
    window.setExitTransition(slide); // The Transition to use to move Views out of the scene when calling a new Activity.
    window.setReenterTransition(slide); // The Transition to use to move Views into the scene when reentering from a previously-started Activity.
    window.setBackgroundDrawable(new ColorDrawable(Color.BLACK));
}

Вторая активность:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    Slide slide = new Slide();
    slide.setInterpolator(new LinearInterpolator());
    slide.setSlideEdge(Gravity.RIGHT);
    slide.excludeTarget(android.R.id.statusBarBackground, true);
    slide.excludeTarget(android.R.id.navigationBarBackground, true);
    window.setEnterTransition(slide); // The Transition to use to move Views into the initial Scene.
    window.setReturnTransition(slide); // The Transition to use to move Views out of the Scene when the Window is preparing to close.
    window.setBackgroundDrawable(new ColorDrawable(Color.BLACK));
}

Вы можете попробовать разные интерполяторы, чтобы изменить темп перехода.

Результирующий переход с LinearInterpolator:

Результирующий переход

Если вы хотите избавиться от разрыва между слайдом из первого и вставить второе действие, которое вы можете установить:

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

Как отлаживать переходы:

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

Для (визуально) отладочных переходов в настройках разработки есть 3 варианта ( "Шкала анимации окон", "Масштаб анимации перехода", "Масштаб анимации" ), чтобы умножить продолжительность всех переходов/анимаций.

Ответ 2

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

Anim/slide_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="100%"
        android:toXDelta="0%"
        android:duration="600"
        />
</set>

Anim/slide_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromXDelta="0%"
        android:toXDelta="100%"
        android:duration="600"
        />
</set>

Anim/stay.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="600"/>
</set>

Основная деятельность startActivity:

startActivity(intent);
overridePendingTransition(
        R.anim.slide_in,
        R.anim.stay
);

Возврат второй активности:

@Override
public void onBackPressed() {
    super.onBackPressed();

    overridePendingTransition(
            0,
            R.anim.slide_out
    );
}

Ответ 3

У меня также была эта проблема, но с переходом фрагментов, и поскольку все решения, которые появились, просто устанавливали фон окна, который, вероятно, работает с действиями, которые я ничуть не получал. Чем я думал = > давайте просто попробуем установить фон rootview в фрагменте, который я вдавливаю в прозрачный. И вуаля, это сделал трюк. Итак, корень фрагмента, который я нажимаю, выглядит так: xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">