Есть ли способ предотвратить "прыжок" макета, когда строка состояния скрыта?
Я пытаюсь реализовать просмотрщик фотографий в моем приложении, используя пейджер просмотра. Я могу заставить системный интерфейс исчезать (и навигацию, и строку состояния) одним касанием. Единственная проблема, с которой я сталкиваюсь, заключается в том, что мой макет на моем пейджере просмотра начинает дрожать или прыгать каждый раз, когда я пропускаю и снова отображаю строку состояния.
Визуализация моей реализации: 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
}