在 Jetpack Compose 中使用 dp 和 sp 尺寸的最佳实践是什么?

ser*_*rov 15 android dimension android-resources android-jetpack android-jetpack-compose

我想了解如何更好地在 Compose 项目中使用 dp 和 sp 值。我检查了几个开源 Compose 项目,其中大多数都对维度进行了硬编码。这绝对不是支持灵活性和不同屏幕尺寸的方法。我目前看到几个方法:

  1. 使用旧方法并dimens.xml直接在调用 的 compose 函数中获取值dimensionResource()
  2. 引用dimens.xmlKotlin 类中 的值。例如:
    class AppDimensions {
        val paddingSmall: Dp
        @Composable
        get() = dimensionResource(R.dimen.padding_small)
    ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 不要针对不同的屏幕尺寸使用dimens.xml并实现自己的逻辑。例如:
    class AppDimensions {
        val paddingSmall = when(screenSize) {
            Compact -> 10.dp
            Medium -> 16.dp
            Expanded -> 20.dp
            else -> 10.dp
        }
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

我喜欢第三种变体,因为它看起来更灵活并且允许我们避免返回 XML。但这需要努力来支持。

但是,也许我们可以以更方便的方式使用它吗?

Cin*_*com 10

我在撰写中使用这种方式;

val LocalDim = compositionLocalOf { Dimensions() }

data class Dimensions(
    val default: Dp = 0.dp,
    val spaceXXSmall: Dp = 2.dp,
    val spaceExtraSmall: Dp = 4.dp,
    val spaceSmall: Dp = 8.dp,
    val spaceMedium: Dp = 16.dp,
    val spaceLarge: Dp = 32.dp,
    val spaceExtraLarge: Dp = 64.dp,
    val spaceXXLarge: Dp = 128.dp,
    val spaceXXXLarge: Dp = 256.dp
}
Run Code Online (Sandbox Code Playgroud)

用来;

val dimensions = LocalDim.current
Run Code Online (Sandbox Code Playgroud)

  • 我在这个答案的基础上添加了这篇好文章 https://proandroiddev.com/supporting- Different-screen-sizes-on-android-with-jetpack-compose-f215c13081bd (5认同)
  • @commandiron 谢谢!但是如何通过此实现来管理不同的屏幕尺寸呢? (2认同)