1. 旧API隐藏导航栏:
window.attributes.apply {systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVEwindow.attributes = this}
但在SDK30开始,我们发现systemUiVisibility,SYSTEM_UI_FLAG_HIDE_NAVIGATION,SYSTEM_UI_FLAG_IMMERSIVE 已经被废弃了,我们应当用新的API进行调用,新的API兼容旧版本;
1.1 新API隐藏导航栏:
/*** @param immersive 是否启用沉浸式导航栏 true启用,导航栏将透明,底部上滑出现,过段时间消失* false不启用,导航栏不透明,底部上滑出现,出现后不再消失*/private fun hideNavigationBar(window: Window, immersive: Boolean) {val windowInsetsControllerCompat = WindowInsetsControllerCompat(window, window.decorView)windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.navigationBars())windowInsetsControllerCompat.systemBarsBehavior =if (immersive) WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPEelse WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE}
1.2隐藏导航栏,可用扩展函数的方式:
/*** 隐藏底部导航栏,导航栏不透明,底部上滑出现,出现后不再消失*/fun AppCompatActivity.hideNavigationBarOnce() {hideNavigationBar(window, false)}/*** 隐藏底部导航栏,导航栏不透明,底部上滑出现,出现后不再消失*/fun DialogFragment.hideNavigationBarOnce() {dialog?.window?.let { hideNavigationBar(it, false) }}/*** 隐藏底部导航栏,导航栏不透明,底部上滑出现,出现后不再消失*/fun Dialog.hideNavigationBarOnce() {window?.let { hideNavigationBar(it, false) }}/*** 隐藏底部导航栏,导航栏将透明,底部上滑出现,过段时间消失*/fun AppCompatActivity.hideNavigationBarAlways() {hideNavigationBar(window, true)}/*** 隐藏底部导航栏,导航栏将透明,底部上滑出现,过段时间消失*/fun DialogFragment.hideNavigationBarAlways() {dialog?.window?.let { hideNavigationBar(it, true) }}/*** 隐藏底部导航栏,导航栏将透明,底部上滑出现,过段时间消失*/fun Dialog.hideNavigationBarAlways() {window?.let { hideNavigationBar(it, true) }}
2. 旧API隐藏状态栏:
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
在SDK30开始,WindowManager.LayoutParams.FLAG_FULLSCREEN以及WindowManager.LayoutParams.FLAG_FULLSCREEN也被废弃了,同样我们需要使用新版API
2.1 新API隐藏隐藏状态栏:
/*** 隐藏状态栏*/fun AppCompatActivity.hideStatusBar() {val windowInsetsControllerCompat = WindowInsetsControllerCompat(window, window.decorView)windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.statusBars())}
2.2设置状态栏透明
/*** 设置状态栏透明*/fun AppCompatActivity.setStatusBarTransparent() {window.statusBarColor = Color.TRANSPARENT}
2.3 获取状态栏高度
/*** 状态栏高度*/val AppCompatActivity.statusBarHeightget() = run {val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")if (resourceId > 0) resources.getDimensionPixelSize(resourceId)else 20F.dp2px.toInt()}/*** 将DP转化成PX*/val Float.dp2pxget() = TypedValue.applyDimension(PLEX_UNIT_DIP,this,Resources.getSystem().displayMetrics)/*** 将PX转化为DP*/val Float.px2dpget() = TypedValue.applyDimension(PLEX_UNIT_PX,this,Resources.getSystem().displayMetrics)
3. 新API隐藏导航栏、状态栏、标题栏:
/*** 沉浸式隐藏状态栏,标题栏,导航栏* @param immersive 是否启用沉浸式导航栏 true启用,导航栏将透明,底部上滑出现,过段时间消失* false不启用,导航栏不透明,底部上滑出现,出现后不再消失*/fun AppCompatActivity.hideSystemBar(immersive: Boolean = true) {val windowInsetsControllerCompat = WindowInsetsControllerCompat(window, window.decorView)windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars())windowInsetsControllerCompat.systemBarsBehavior =if (immersive) WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPEelse WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE}
4. 设置全屏模式
/*** 设置是否全屏显示界面* 全屏显示时,界面将不考虑状态栏、导航栏的高度,显示到状态栏、导航栏背后* @param isFullScreen true为全屏显示 false为非全屏*/fun AppCompatActivity.setFullScreen(isFullScreen: Boolean = true) {WindowCompat.setDecorFitsSystemWindows(window, !isFullScreen)}