Jetpack Compose 中十六进制字符串的颜色

Color from hex string in jetpack compose

如何解析十六进制字符串,例如#9CCC65Color class 在 Jetpack Compose 中。

P.S: jetpack compose 包中似乎缺少选项


当前解决方法: 从标准颜色 class 导出 parseColor() 方法。

@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")
}

您可以通过 getColor 方法使用此对象 class。

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

Jetpack Color class 即 androidx.ui.graphics.Color 在构造函数中仅采用 RGB、ARGB、ColorSpace 和 colorInt。参见:Color.kt

所以,这里我们直接从 android.graphics.Color 访问 parseColor() 方法,其中 returns colorInt.

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

不是以字符串形式传递,而是以十六进制形式传递。例如,如果您想要这种 #9CCC65 颜色,只需删除前面的 # 并将其替换为 0xFF。例子

val PrimaryBlue = Color(0xFF9CCC65)

另一种选择是编写类似于 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"))

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

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

这可以用作颜色十六进制 String 上的成员 属性。

"#FF0000".color

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

val hashColorString = "#00AB18"
val color = Color(hashColorString.removePrefix("#").toInt(16))

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

    val myColorString = "#B00020"
    val myComposeColorInt = Color(myColorString.toColorInt())

如果您想避免必须导入 android.graphics.Color,这是另一个简单的替代方法:

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

Color 在这种情况下会立即成为来自 androidx.compose.ui.graphics.Color.

的那个