Есть ли способ предотвратить "прыжок" макета, когда строка состояния скрыта?

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

Визуализация моей реализации: https://im5.ezgif.com/tmp/ezgif-5-3bc0b29d50a7.gif

То, что я пытаюсь реализовать: https://im5.ezgif.com/tmp/ezgif-5-aa30b54b5483.gif

Я попытался установить системные флаги пользовательского интерфейса в соответствии с предложением в этом стеке над сообщением потока. Но это все еще дает мне "нервный" ответ макета.

Код ниже - то, что я использовал, чтобы скрыть / показать строку состояния:

/**
 * Hide status bar and navigation bar.
 */
private fun hideSysWindows(activity: Window) {
    activity.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_FULLSCREEN
            or View.SYSTEM_UI_FLAG_IMMERSIVE)
}

/**
 * Show status bar and navigation bar.
 */
private fun showSysWindows(activity: Window) {
    activity.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
}

XML-код для моего просмотра пейджера:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="@color/black">

    <com.example.snapkit.mediaviewer.MediaViewPager android:layout_width="match_parent"
                                                    android:layout_height="match_parent"
                                                    android:id="@+id/media_viewer"/>

</LinearLayout>

0 ответов

Поэтому я реализовал новый проект и попробовал его на двух разных устройствах в моем эмуляторе (Pixel 2 XL и Pixel 3 XL). Я заметил, что он обычно скрывался под пикселем 2, но на пикселе 3 xl (с выемкой) он рисовал ниже самой выемки.

После некоторого поиска я понял, что мне нужно возиться с вырезом на дисплее (также известным как выемка) и установить флаг, чтобы сообщить системному пользовательскому интерфейсу рисовать под самой выемкой.

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
        window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    }
Другие вопросы по тегам