隐藏状态栏时,有什么方法可以防止布局“跳跃”吗?

时间:2019-08-31 23:33:21

标签: android xml kotlin android-viewpager windowinsets

我正在尝试使用视图寻呼机在我的应用中实现照片查看器。我能够通过一次触摸使系统UI消失(导航和状态栏)。我唯一遇到的问题是,每当我使状态栏消失并重新出现时,视图分页器上的布局就会开始抖动或跳跃。

A visual of my implementation

What I'm trying to implement

我尝试按照流发布后this堆栈中的建议设置系统ui标志。但这仍然给了我“跳跃式”的布局响应。

下面的代码是我用来隐藏/显示状态栏的代码:

/**
 * 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>

1 个答案:

答案 0 :(得分:0)

因此,我在一个新项目中进行了实现,并在模拟器中的两种不同设备(Pixel 2 XL和Pixel 3 XL)上进行了尝试。我注意到的是,它通常会隐藏在像素2下方,但在像素3 xl(带有缺口)上会绘制在缺口本身下方。

经过一番搜索,我意识到我必须弄乱display cutout(也称为缺口),并设置一个标志来告诉系统ui在缺口本身下绘制。

这就像一个咒语,希望下面的代码能帮助任何看到这一点的人。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
        window.attributes.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    }