27

如何解析十六进制字符串,例如#9CCC65在jetpack compose的Color类中。

PS:jetpack compose 包中似乎缺少选项


当前解决方法:parseColor()从标准 Color 类 导出的方法。

@ColorInt
fun parseColor(@Size(min = 1) colorString: String): Int {
    if (colorString[0] == '#') { // Use a long to avoid rollovers on #ffXXXXXX
        var color = colorString.substring(1).toLong(16)
        if (colorString.length == 7) { // Set the alpha value
            color = color or -0x1000000
        } else require(colorString.length == 9) { "Unknown color" }
        return color.toInt()
    }
    throw IllegalArgumentException("Unknown color")
}
4

7 回答 7

27

而不是作为字符串传递,而是作为十六进制传递。例如,如果您想要此#9CCC65颜色,只需移除前面#并将其替换为 0xFF。例子

val PrimaryBlue = Color(0xFF9CCC65)
于 2020-12-11T15:03:44.283 回答
25

您可以将此对象类与 getColor 方法一起使用。

object HexToJetpackColor {
    fun getColor(colorString: String): Color {
            return Color(android.graphics.Color.parseColor("#" + colorString))
    }
}

Jetpack Color 类,即androidx.ui.graphics.Color在构造函数中只接受 RGB、ARGB、ColorSpace 和 colorInt。看:Color.kt

所以,这里我们直接访问返回 colorInt的parseColor()方法。android.graphics.Color

因此 parseColor() 方法可用于获取 colorInt,然后将其提供给 Jetpack Color 类以获取androidx.ui.graphics.Color对象。

于 2020-03-01T20:32:01.513 回答
9

与 类似Int.dp,可以有String.color扩展属性。

val String.color 
    get() = Color(android.graphics.Color.parseColor(this))

这可以用作 color hex 的成员属性String

"#FF0000".color
于 2021-05-31T14:55:07.720 回答
5

另一种选择是编写一个类似于 android.graphics.Color 工作方式的扩展函数:

import androidx.compose.ui.graphics.Color

fun Color.Companion.parse(colorString: String): Color =
    Color(color = android.graphics.Color.parseColor(colorString))

然后你可以这样写你的作曲:

Modifier.background(Color.parse("#FF0000"))
于 2021-03-28T16:13:57.013 回答
0

我也遇到了这个问题,终于找到了解决办法:

    val myColorString = "#B00020"
    val myComposeColorInt = Color(myColorString.toColorInt())
于 2022-01-18T12:26:36.390 回答
0

不依赖Android的解决方案怎么样?#KMP

val hashColorString = "#00AB18"
val color = Color(hashColorString.removePrefix("#").toInt(16))
于 2021-10-17T13:08:54.950 回答
0

如果您想避免必须 import android.graphics.Color,这是另一个简单的选择:

val hexString = "#f8f8f2"
Color(("ff" + hexString.removePrefix("#").lowercase()).toLong(16))

Color在这种情况下,将立即来自androidx.compose.ui.graphics.Color.

于 2022-02-09T15:06:03.230 回答