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,提问作者Данил Борисенко
相关产品推荐
相关产品推荐

