如何在Jetpack Compose中将颜色资源转换为Color对象?

4

我有一段文本,想要画一个圆圈,这个圆圈的颜色应该在我的资源文件中存在。

Text(
    modifier = Modifier.align(Alignment.TopEnd).drawBehind {
        drawCircle(
            color = colorResource(R.color.primary),
            radius = 96.00f
        )
    },
    text = "X"
)

但我得到的是:

@Composable调用只能在@Composable函数的上下文中发生

如果我使用color = Color.Red,它可以正常工作。所以我不想使用那些颜色,我想使用自己的颜色。因此,我想进行转换,但我找不到任何解决方案。我该如何进行转换?

1个回答

6
你需要在带有@Composable注解的范围内调用可组合函数。
Box() {
  val color = colorResource(R.color.black)
  Text(
      modifier = Modifier.align(Alignment.TopEnd).drawBehind {
          drawCircle(
              color = color,
              radius = 96.00f
          )
      },
      text = "X"
  )
}

colorResource是一个@Composable函数。

@Composable
@ReadOnlyComposable
fun colorResource(@ColorRes id: Int): Color {
    val context = LocalContext.current
    return if (Build.VERSION.SDK_INT >= 23) {
        ColorResourceHelper.getColor(context, id)
    } else {
        @Suppress("DEPRECATION")
        Color(context.resources.getColor(id))
    }
}

但是 Modifier.drawBehind 的 lambda 表达式不是这样的

fun Modifier.drawBehind(
    onDraw: DrawScope.() -> Unit
) = this.then(
    DrawBackgroundModifier(
        onDraw = onDraw,
        inspectorInfo = debugInspectorInfo {
            name = "drawBehind"
            properties["onDraw"] = onDraw
        }
    )
)

您可以查看此答案,了解带有@Composable注释的函数、lambda或参数与不带注释的函数之间的区别。

非常感谢您,再次感谢。现在非常清楚了。 - Joan P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接