Compose 适配 - 全屏显示 EdgeToEdge

官方页面

参考文章

一、概念

edge-to-edge 就是将APP的内容延伸到系统栏区域(状态栏、导航栏、刘海),提供更沉浸的体验。

二、实现

2.1 设置全屏显示

Android 15(API 35)开始会强制开启,更低版本需要在 Activity 的 onCreate() 中调用 enableEdgeToEdge() 方法(最低支持到 Android 6.0),反正无脑必调用就行。

Kotlin 复制代码
Activity {
    onCreate() {
        enableEdgeToEdge()
    }
}

2.2 处理系统重叠冲突

当内容绘制到系统栏区域时,就需要解决遮挡冲突了(可视问题、点击遮挡、手势冲突)。通过 Modifier 来设置(注意调用的先后问题,如背景色),表中左边包含了右边。

|---------------------------------|----------------------------------------------|---------------------------------|
| .safeContentPadding() 一个方法全部搞定。 | .safeDrawingPadding() 避免内容延伸至系统栏区域造成点击或可视问题。 | .statusBarsPadding() 状态栏边距。 |
| .safeContentPadding() 一个方法全部搞定。 | .safeDrawingPadding() 避免内容延伸至系统栏区域造成点击或可视问题。 | .navigationBarsPadding() 导航栏边距。 |
| .safeContentPadding() 一个方法全部搞定。 | .safeGesturesPadding() 避免系统全面屏手势与应用手势冲突。 ||

Kotlin 复制代码
@Composable
fun MainScreen() {
    Box(
        modifier = Modifier
            .fillMaxSize()
            .background(AppColors.green)
            .safeContentPadding()
    ) {...}
}

三、一些技巧

3.1 状态栏半透明保护

谷歌官方提供的方式,解决可读性。

Kotlin 复制代码
class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            MyTheme {
                MyContent()
                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) }
}
相关推荐
lpruoyu25 分钟前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习
独自破碎E1 小时前
【BISHI15】小红的夹吃棋
android·java·开发语言
李堇4 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly6 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者89 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20359 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥9 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓9 小时前
[JDBC]元数据
android
独行soc9 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能10 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio