首页 > 解决方案 > Jetpack Compose:支持所有屏幕尺寸的最佳方式是什么?

问题描述

我在 Google 上搜索了多种使用 Jetpack compose 在 Android 上支持多种屏幕尺寸的方法,我终于找到了 Google 文档: https ://developer.android.com/guide/topics/large-screens/support-different-screen-sizes#撰写

enum class WindowSizeClass { COMPACT, MEDIUM, EXPANDED }

@Composable
fun Activity.rememberWindowSizeClass() {
    val configuration = LocalConfiguration.current
    val windowMetrics = remember(configuration) {
        WindowMetricsCalculator.getOrCreate()
            .computeCurrentWindowMetrics(this)
    }
    val windowDpSize = with(LocalDensity.current) {
        windowMetrics.bounds.toComposeRect().size.toDpSize()
    }
    val widthWindowSizeClass = when {
        windowDpSize.width < 600.dp -> WindowSizeClass.COMPACT
        windowDpSize.width < 840.dp -> WindowSizeClass.MEDIUM
        else -> WindowSizeClass.EXPANDED
    }

    val heightWindowSizeClass = when {
        windowDpSize.height < 480.dp -> WindowSizeClass.COMPACT
        windowDpSize.height < 900.dp -> WindowSizeClass.MEDIUM
        else -> WindowSizeClass.EXPANDED
    }

    // Use widthWindowSizeClass and heightWindowSizeClass
}

但这对于 ldpi 屏幕和存储这些变量的位置可能是个问题?我是否需要像旧方法一样将尺寸值存储在所有密度的尺寸文件夹中?因为例如 400dp 屏幕上的图像在 ldpi 屏幕(~120dp)上可能看起来非常大,所以我很困惑,而且我是 jetpack compose 的新手。在此先感谢您的帮助。

标签: androidandroid-jetpack-compose

解决方案


上面的代码只是一个例子。您可以基于此创建自己的代码以idea满足您的需求。

可以使用资源系统来保存维度,但我真的没有理由这样做。如果您的图像是 200dp,则应为 200dp。DP是动态的。是的,200dp 在小屏幕上会更大,但它应该是因为用户应该实际看到图像的内容。

您的应用程序布局不会在不同的屏幕尺寸和设置上中断,这是另一个与理论上的撰写无关的问题。您只需要以一种对字体/dpi 大小变化不太敏感的方式设计布局,这意味着轻微的字体/dpi 大小变化不应破坏布局。

除此之外,您可以为屏幕配置编写不同的可组合项,这些配置与您的标准可组合项的工作差异太大。


推荐阅读