喷气背包中十六进制字符串的颜色组合

Vip*_*sri 18 android android-jetpack-compose

如何解析十六进制字符串如#9CCC65颜色类Jetpack的撰写。

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")
}
Run Code Online (Sandbox Code Playgroud)

Om *_*mar 22

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

val String.color 
    get() = Color(android.graphics.Color.parseColor(this))
Run Code Online (Sandbox Code Playgroud)

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

"#FF0000".color
Run Code Online (Sandbox Code Playgroud)


Tob*_*237 18

我也遇到了这个问题,最后找到了解决方案:

    val myColorString = "#B00020"
    val myComposeColorInt = Color(myColorString.toColorInt())
Run Code Online (Sandbox Code Playgroud)

  • 请注意: toColorInt() 在底层调用 android.graphics.Color.parseColor() ,因此不能在常规单元测试中使用。 (2认同)

abh*_*era 18

十六进制字符串到颜色 [此扩展功能在 android sdk 中可用]

Color("#FFFFFF".toColorInt())
Run Code Online (Sandbox Code Playgroud)

如果你想转换回十六进制代码

fun Color.toHexCode(): String {
    val red = this.red * 255
    val green = this.green * 255
    val blue = this.blue * 255
    return String.format("#%02x%02x%02x", red.toInt(), green.toInt(), blue.toInt())
}
Run Code Online (Sandbox Code Playgroud)

如果你也想要 alpha 值

fun Color.toHexCodeWithAlpha(): String {
            val alpha = this.alpha*255
            val red = this.red * 255
            val green = this.green * 255
            val blue = this.blue * 255
            return String.format("#%02x%02x%02x%02x", alpha.toInt(),red.toInt(), green.toInt(), blue.toInt())
        }
Run Code Online (Sandbox Code Playgroud)

如果我们处于组合多平台或基于 jvm 的单元测试中,则toColorInt()扩展将不可用,您可以使用它

Color("#FFFFFF".toColorInt())
Run Code Online (Sandbox Code Playgroud)


May*_*hwa 14

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

val PrimaryBlue = Color(0xFF9CCC65)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案不相关,因为问题明确提到在运行时将字符串解析为颜色。 (19认同)
  • 这个答案是最好的,因为我一直在寻找这个解决方案,并且我首先想到了这个问题。 (6认同)

Chr*_*ris 13

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

import androidx.compose.ui.graphics.Color

fun Color.Companion.parse(colorString: String): Color =
    Color(color = android.graphics.Color.parseColor(colorString))
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样写你的文章:

Modifier.background(Color.parse("#FF0000"))
Run Code Online (Sandbox Code Playgroud)


Maj*_*eee 12

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

val hashColorString = "#00AB18"
val color = Color(hashColorString.removePrefix("#").toLong(16) or 0x00000000FF000000)
Run Code Online (Sandbox Code Playgroud)


Tig*_*yan 11

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

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

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对象。

  • 或者您可以在项目中添加扩展功能。fun Color.fromHex(color: String) = Color(android.graphics.Color.parseColor("#" + colorString)) (3认同)
  • @facundomr 那么你应该使用 Color.Companion 而不仅仅是 Color,以 `Color.fromString()` 形式使用它。 (2认同)