当您的应用以 SDK 35 或更高版本为目标平台后,系统会强制采用无边框设计。系统状态栏和手势导航栏是透明的,但三按钮导航栏是半透明的。调用 enableEdgeToEdge
以使其向后兼容。
不过,系统默认值可能并不适用于所有用例。如需大致了解何时应考虑使用透明或半透明系统栏,请参阅 Android 系统栏设计指南和边到边设计指南。
创建透明系统栏
通过定位到 Android 15 或更高版本,或通过使用适用于较低版本的默认参数调用 enableEdgeToEdge()
,创建透明的手势导航栏。对于三按钮导航栏,请将 Window.setNavigationBarContrastEnforced
设为 false
,否则系统会应用半透明遮罩。
创建半透明系统栏
如需创建半透明状态栏,请创建一个与主要内容重叠的自定义可组合项,并在内边距覆盖的区域中绘制渐变。
class SystemBarProtectionSnippets : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // enableEdgeToEdge sets window.isNavigationBarContrastEnforced = true // which is used to add a translucent scrim to three-button navigation enableEdgeToEdge() setContent { MyTheme { // Main content MyContent() // After drawing main content, draw status bar protection StatusBarProtection() } } } } @Composable private fun StatusBarProtection( color: Color = MaterialTheme.colorScheme.surfaceContainer, heightProvider: () -> Float = calculateGradientHeight(), ) { Canvas(Modifier.fillMaxSize()) { val calculatedHeight = heightProvider() val gradient = Brush.verticalGradient( colors = listOf( color.copy(alpha = 1f), color.copy(alpha = .8f), Color.Transparent ), startY = 0f, endY = calculatedHeight ) drawRect( brush = gradient, size = Size(size.width, calculatedHeight), ) } } @Composable fun calculateGradientHeight(): () -> Float { val statusBars = WindowInsets.statusBars val density = LocalDensity.current return { statusBars.getTop(density).times(1.2f) } }
对于自适应应用,请插入与每个窗格的颜色相匹配的自定义可组合项,如无边框设计中所示。如需创建半透明导航栏,请将 Window.setNavigationBarContrastEnforced
设为 true。