You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose中如何实现滑动唤出全透明系统栏并自动隐藏?

解决Jetpack Compose系统栏隐藏+滑动唤出透明自动隐藏问题

完整解决方案代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    
    // 消除系统栏灰色底色的核心配置
    window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
    window.navigationBarDividerColor = Color.TRANSPARENT
    
    // 设置滑动唤出系统栏并自动隐藏的行为
    val insetsController = WindowCompat.getInsetsController(window, window.decorView)
    insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
    
    setContent {
        Puzzle_QuestTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                val systemUiController = rememberSystemUiController()
                LaunchedEffect(Unit) {
                    // 启动时隐藏系统栏
                    systemUiController.hideSystemBars()
                    // 设置系统栏完全透明
                    systemUiController.setStatusBarColor(Color.Transparent)
                    systemUiController.setNavigationBarColor(Color.Transparent, darkIcons = false)
                    // 禁用强制对比度,避免系统自动添加底色
                    systemUiController.isNavigationBarContrastEnforced = false
                }
                
                PuzzleQuestApp()
            }
        }
    }
}

关键配置说明

  • WindowCompat.setDecorFitsSystemWindows(window, false):允许布局延伸至系统栏区域,是实现透明系统栏的前提。
  • window.setBackgroundDrawable(Color.TRANSPARENT):解决使用BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE时出现的灰色底色问题,部分系统会默认复用窗口背景作为系统栏底色。
  • window.navigationBarDividerColor = Color.TRANSPARENT:移除导航栏下方的灰色分割线(Android 10+部分设备存在)。
  • systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE:配置滑动边缘唤出系统栏,且系统栏会在短暂显示后自动隐藏。
  • LaunchedEffect(Unit):在Compose初始化时执行一次,确保启动时系统栏隐藏且透明。
  • isNavigationBarContrastEnforced = false:禁止系统为保证图标对比度自动添加半透明底色,确保系统栏完全透明无阴影。

问题根源说明

  • 单独使用systemUiController.isSystemBarsVisible = false仅能隐藏系统栏,但未配置自动隐藏的行为逻辑,导致唤出后无法自动消失。
  • 直接设置systemBarsBehavior时未处理窗口背景和导航栏分割线,导致系统栏出现灰色底色和阴影。

内容的提问来源于stack exchange,提问作者Данил Борисенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 07:25:16