Как удалить задержку при открытии операции с помощью DrawerLayout?

У меня есть активность с DrawerLayout, но всякий раз, когда он открывается, происходит отсрочка, такая как секундная секция, где экран белый, тогда мой экран рисуется.

Это происходит после завершения перехода. Таким образом, это похоже на переход к анимации экрана.

Я попытался поместить это в свой OnCreate после привязки взглядов к ButterKnife, но ничего не сделал.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        postponeEnterTransition();
        drawerLayout.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            public boolean onPreDraw() {
                drawerLayout.getViewTreeObserver().removeOnPreDrawListener(this);
                startPostponedEnterTransition();
                return true;
            }
        });
    }

Да, я оптимизирую его для Lollipop, а для устройств pre-Lollipop я использую overridePendingTransitions, и он отлично работает. Моя проблема заключается только в устройствах Lollipop.

Btw, мои переходы "Enter" и "Выход" являются fade_in_out, определенными в xml и указанными в styles

<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorAccent">@color/pink</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowActivityTransitions">true</item>
    <item name="android:windowContentTransitions">true</item>
    <!-- specify enter and exit transitions -->
    <!-- options are: explode, slide, fade -->
    <item name="android:windowEnterTransition">@transition/fade_in_out_transition</item>
    <item name="android:windowExitTransition">@transition/fade_in_out_transition</item>

    <!-- specify shared element transitions -->
    <item name="android:windowSharedElementEnterTransition">@transition/change_clip_bounds</item>
    <item name="android:windowSharedElementExitTransition">@transition/change_clip_bounds</item>
    <item name="android:windowSoftInputMode">stateAlwaysHidden|adjustResize</item>
</style>

Ответы

Ответ 1

Наконец-то я нашел решение. Я не знаю, почему и как это работает, но я просто знаю, что он удалил задержку в анимации. Я добавил обработчик в OnCreate активности, который запустил бы другие инструкции для настройки, т.е. Добавив исходный фрагмент в представление, после 300 мс

Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        switchFragment();
    }
}, 300);

Ответ 2

Может быть, потому что у lollipop есть default layoutTransition на элементах пользовательского интерфейса, вы пробовали?

drawerLayout.setLayoutTransition(null)

Ответ 3

Я бы изменил ваш переход на выход:

item name="android:windowExitTransition">@transition/fade_in_out_transition</item>
item 

Возврат окна:

name="android:windowReturnTransition">@transition/fade_in_out_transition</item>
  • Когда вы используете оконный выход, видимость окна мгновенно меняется до невидимого до начала следующего перехода.

Устанавливает переход, который будет использоваться для перемещения видов вне сцены   когда фрагмент удаляется, скрывается или отсоединяется, когда не появляется задний стоп. Выходными представлениями будут те, которые являются регулярными Views или ViewGroups, у которых есть isTransitionGroup(), возвращает true. Типичные переходы расширят видимость, поскольку выход управляется   изменяя видимость от VISIBLE до INVISIBLE. Если переход равен NULL, взгляды остаются незатронутыми.

setExitTransition

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

Ссылка на ресурс XML перехода, определяющий желаемый Переход, используемый для перемещения. Виды вне сцены, когда Окно готовясь к закрытию. Соответствует   setReturnTransition (android.transition.Transition).

android:windowReturnTransition

  1. Я бы также рекомендовал использовать reenter для управления обратными прессами.

Ссылка на ресурс XML перехода, определяющий желаемый переход используется для перемещения видов на сцену при возврате с ранее начатая деятельность. Соответствует setReenterTransition (android.transition.Transition).

android:windowReenterTransition

Общие сведения о переходах разделяемых элементов exit/reenter

  1. Вы также можете установить значение bool, которое позволит пересечениям перекрываться, однако перекрытие может быть слишком длинным для чего вы хотите.

setAllowEnterTransitionOverlap(boolean)

  1. Также я обновил леденец до 5.0.1
    Есть ошибки в 5.0.0, исправленные в 5.0.1

В этом блоге Linton Ye подробно рассматриваются проблемы, связанные с переходами Lollipop и ошибками.

My Journey to Lollipop Transitions: часть 1