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

Jetpack Compose 获取设备屏幕尺寸偏小 如何获取包含系统栏的完整尺寸?

问题原因

你使用的LocalConfiguration.current.screenWidthDp、screenHeightDp本身设计就是返回当前应用可用的显示区域尺寸,计算时会自动扣除所有系统占用的空间:包括状态栏、导航栏、刘海/挖孔区域的高度,部分厂商系统还会额外扣除手势引导条、屏幕圆角预留空间,因此得到的数值会小于物理屏幕实际尺寸。

获取完整物理屏幕尺寸的实现方法

在Jetpack Compose中可以通过系统WindowManager API获取全屏幕尺寸,兼容全Android版本的实现代码如下:

import android.graphics.Point
import android.os.Build
import android.util.Size
import android.view.WindowManager
import android.content.Context
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity

@Composable
fun getFullScreenSize(): Pair<Int, Int> {
    val context = LocalContext.current
    val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager

    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        // Android 12及以上使用官方推荐API
        val maxBounds = windowManager.maximumWindowMetrics.bounds
        Pair(maxBounds.width(), maxBounds.height())
    } else {
        // 低版本兼容
        val display = windowManager.defaultDisplay
        val point = Point()
        display.getRealSize(point)
        Pair(point.x, point.y)
    }
}

// 使用示例
@Composable
fun ScreenSizeDemo() {
    val (fullWidthPx, fullHeightPx) = getFullScreenSize()
    // 按需转换为dp单位
    val fullWidthDp = with(LocalDensity.current) { fullWidthPx.toDp() }
    val fullHeightDp = with(LocalDensity.current) { fullHeightPx.toDp() }
    
    // 你的后续逻辑
}
  • 上述方法获取的宽高单位为物理像素,包含状态栏、导航栏、刘海区域等所有系统占用部分,和厂商标注的设备屏幕参数一致。
  • 若仅需要获取应用可绘制的安全区域尺寸,不要使用该方法,还是推荐使用LocalConfiguration或WindowInsets API,避免内容被系统组件遮挡。
  • 部分设备存在屏幕圆角、边缘不可触控区域,即使拿到完整物理尺寸,布局时也要适配系统Insets,避免内容显示在不可交互的边缘区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 21:24:08