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

如何在Jetpack Compose中获取屏幕尺寸相对单位?

在Jetpack Compose中实现类似CSS vh 单位的方案

CSS里的vh单位对应视口高度的1%,在Jetpack Compose中没有直接提供这个单位,但可以通过以下几种方式实现相同效果:

1. 适配全屏视口(含系统栏处理)

如果需要的是整个屏幕去除系统栏后的有效高度的百分比,可以通过LocalConfiguration和LocalWindowInsets来计算:

@Composable
fun vh(percent: Float): Dp {
    val config = LocalConfiguration.current
    val insets = LocalWindowInsets.current
    // 计算屏幕总高度减去状态栏、导航栏的高度
    val usableScreenHeight = config.screenHeightDp.dp - insets.statusBars.top.dp - insets.navigationBars.bottom.dp
    return usableScreenHeight * (percent / 100f)
}

使用时直接调用,比如vh(50)就代表有效视口高度的50%,可以直接作为Modifier.height()的参数。

2. 适配局部父布局的视口

如果需要基于父容器的可用高度计算百分比,用BoxWithConstraints获取父布局的最大高度后再计算:

BoxWithConstraints(modifier = Modifier.fillMaxSize()) {
    val halfParentHeight = maxHeight * 0.5f // 对应父容器高度的50%,类似50vh
    Box(
        modifier = Modifier
            .height(halfParentHeight)
            .fillMaxWidth()
            .background(Color.Blue)
    )
}

3. 官方推荐的简化写法

Compose内置的fillMaxHeight(fraction: Float)修饰符可以直接实现类似vh的效果,比如fillMaxHeight(0.3f)就是占当前可用高度的30%,无需额外计算:

Column(modifier = Modifier.fillMaxSize()) {
    // 占屏幕高度的30%
    Box(modifier = Modifier.fillMaxHeight(0.3f).fillMaxWidth().background(Color.Red))
    // 占据剩余全部高度
    Box(modifier = Modifier.fillMaxSize().background(Color.Green))
}

内容的提问来源于stack exchange,提问作者ceving

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:40:59