我什么时候应该使用 Android Jetpack Compose Surface 可组合?

时间:2021-01-27 12:07:37

标签: android android-jetpack android-jetpack-compose

Jetpack Compose 中有 Surface 可组合,它代表一个 material surface。表面允许您设置背景颜色或边框等内容,但似乎可以使用 modifiers 来完成。我应该什么时候使用 Surface 可组合组件?它给我带来了什么好处?

1 个答案:

答案 0 :(得分:11)

Surface 可组合使代码更容易,并明确指示代码使用 material surface。让我们看一个例子:

Surface(
    color = MaterialTheme.colors.primarySurface,
    border = BorderStroke(1.dp, MaterialTheme.colors.secondary),
    shape = RoundedCornerShape(8.dp),
    elevation = 8.dp
) {
    Text(
        text = "example",
        modifier = Modifier.padding(8.dp)
    )
}

结果:

enter image description here

没有 Surface 也可以达到同样的结果:

val shape = RoundedCornerShape(8.dp)
val shadowElevationPx = with(LocalDensity.current) { 2.dp.toPx() }
val backgroundColor = MaterialTheme.colors.primarySurface

Text(
    text = "example",
    color = contentColorFor(backgroundColor),
    modifier = Modifier
        .graphicsLayer(shape = shape, shadowElevation = shadowElevationPx)
        .background(backgroundColor, shape)
        .border(1.dp, MaterialTheme.colors.secondary, shape)
        .padding(8.dp)
)

但它有一些缺点:

  • 修改器链相当大,它实现了一个材质表面并不明显
  • 我必须为形状声明一个变量并将其传递给三个不同的修饰符
  • 它使用 contentColorFor 来确定内容颜色,而 Surface 在幕后进行。因此,backgroundColor 也用于两个地方。
  • 我必须以像素为单位计算海拔
  • Surface 调整高度的颜色(在深色主题的情况下)according to the material design。如果您想要相同的行为,则应手动处理。

有关 Surface 功能的完整列表,最好查看 documentation