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或WindowInsetsAPI,避免内容被系统组件遮挡。 - 部分设备存在屏幕圆角、边缘不可触控区域,即使拿到完整物理尺寸,布局时也要适配系统Insets,避免内容显示在不可交互的边缘区域。
内容的提问来源于stack exchange,提问作者Tonio
相关产品推荐
相关产品推荐

