Android 沉浸式状态栏的实现以及布局重叠的适配(Kotlin)

本文章分以下两部分内容

  1. 首先是沉浸式状态栏的实现
  2. 适配实现沉浸式状态栏后导致的布局偏移

一、沉浸式状态栏的实现

该方法用于表示内容是否超出至状态栏和底部导航栏显示,false表明超出。(这也就我们实现沉浸式后需要做适配的原因)

WindowCompat.setDecorFitsSystemWindows(window, false)

设置状态栏透明

window.statusBarColor = Color.TRANSPARENT

二、处理状态栏UI与布局内容产生的重叠

实现沉浸式后我们会发现,布局内容与状态栏、底部导航栏叠加在一起了,为了避免应用UI与系统UI产生重叠,所以我们要对其进行偏移。

 首先通过这个方法,获取insets。参数view可以任意选择,只需要是位于实现沉浸式的页面即可

   ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
        
        }

那么insets具体是什么呢?实际上insets是描述一组用于窗口内容的插入。说人话就是:我们可以从insets中获取包括状态栏,导航栏等系统UI的位置距离,然后用于调整我们的应用UI的位置。接下来我们就来看如何实现

   ViewCompat.setOnApplyWindowInsetsListener(view) { view, insets:WindowInsetsCompat ->
          
          val systemWindow=insets.getInsets(WindowInsetsCompat.Type.systemBars() or 
                                      WindowInsetsCompat.Type.displayCutout())
           
          //为需要偏移的view设置padding
          moveView.setPadding(0,systemWindow.top,0,0)

            insets
        }

通过inset.getInsets()获取对应的系统UI的信息, 我们也可以通过 “or” 同时获取多种系统栏的距离。例如我们可以同时获取系统的状态栏和刘海屏高度,如果刘海屏的高度更高则返回的是刘海屏的高度。

而因为沉浸式所导致的底部布局与导航栏重叠问题也一样迎刃而解了。

view.setPadding(0,0,0,systemWindow.bottom)

WindowInsetsCompat.Type参数解释:

WindowInsetsCompat.Type.ime();//键盘
WindowInsetsCompat.Type.displayCutout();//刘海屏
WindowInsetsCompat.Type.statusBars();//状态栏
WindowInsetsCompat.Type.navigationBars();//导航栏
WindowInsetsCompat.Type.captionBar();//标题栏
WindowInsetsCompat.Type.systemBars();//状态栏,导航栏和标题栏
WindowInsetsCompat.Type.systemGestures();//系统手势 
WindowInsetsCompat.Type.mandatorySystemGestures();//强制性系统手势
WindowInsetsCompat.Type.tappableElement();//可点击区域

猜你喜欢

转载自blog.csdn.net/oxygen112/article/details/128625766