https://www.yisu.com/zixun/217057.html

沉浸式状态栏相关API

对比维度 android:fitsSystemWindows="true" android:windowTranslucentStatus="true" window.statusBarColor WindowCompat.setDecorFitsSystemWindows(window, false)
本质 布局属性 主题属性 Window API Window API
引入版本 API 1 API 19 API 21 API 30 (兼容库)
核心作用 让View自动避让系统栏 让状态栏变半透明 设置状态栏颜色 让窗口不再自动避让系统栏
对Insets的影响 使用系统提供的Insets 将状态栏Insets设为0 不影响Insets 保留Insets,交出控制权
是否改变状态栏外观 ❌ 不影响 ✅ 变成半透明 ✅ 改变颜色 ❌ 不影响
是否能实现全屏 ❌ 不能 ⚠️ 部分能(内容上移) ❌ 不能单独实现 ✅ 可以(需配合监听)
控制权 系统自动 系统自动 开发者手动 开发者手动

实现侵入有2种方式(全屏)

  • 第1种:主题属性android:windowTranslucentStatus="true",状态栏会固定半透明颜色且状态栏颜色API调用无效 window.statusBarColor ,View会侵入状态栏。

  • 第2种:通过WindowCompat.setDecorFitsSystemWindows(window, false),但是状态栏不会自动半透明,调用APIwindow.statusBarColor 设置会生效。

  • 第3种:通过enableEdgeToEdgeAPI,此API是对WindowCompat.setDecorFitsSystemWindows(window, false)及状态栏设置为透明等方法的封装。

设置偏移距离

  • 系统自动设置:android:fitsSystemWindows="true"
  • 精确设置
    ViewCompat.setOnApplyWindowInsetsListener 是 Android 中处理窗口内边距(Insets)的核心API,它的作用是让你能够精确控制每个 View 如何响应系统栏(状态栏、导航栏、键盘等)的空间变化

    ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { view, insets ->
            val systemBarsInsets = insets.getInsets(
                WindowInsetsCompat.Type.systemBars()
            )
    
            // 这里你可以精确控制:
            // - 想让背景图全屏:不给 view 设置 padding
            // - 想让文字避开状态栏:给 TextView 设置 top padding
    
            // 例如:让整个布局延伸到状态栏后面
            view.setPadding(
                view.paddingLeft,
                0,  // top padding 设为 0,内容就会顶到顶部
                view.paddingRight,
                view.paddingBottom
            )
    
            insets
        }

设置系统栏行为

windowInsetsController.systemBarsBehavior


0 条评论

发表回复

您的电子邮箱地址不会被公开。