android jetpack组合中十六进制字符串的颜色

huwehgph  于 2022-12-09  发布在  Android
关注(0)|答案(8)|浏览(175)

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

附言:Jetpack合成包中似乎缺少选项
**目前的解决方法:**已从标准Color类别汇出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")
}
ggazkfy8

ggazkfy81#

不作为String传递,而是作为Hexadecimal传递。例如,如果你想要这个#9CCC65 Color,只需要移除前面的#并替换为0xFF。示例

val PrimaryBlue = Color(0xFF9CCC65)
a6b3iqyw

a6b3iqyw2#

您可以将此对象类别与getColor方法搭配使用。

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

或者我们可以使用扩展函数

fun Color.fromHex(color: String) = Color(android.graphics.Color.parseColor("#" + colorString))

Jetpack Color类(即androidx.ui.graphics.Color)在构造函数中只接受RGB、ARGB、ColorSpace和colorInt。请参见:Color.kt
因此,这里我们直接从返回colorInt的android.graphics.Color访问parseColor()方法。
因此,parseColor()方法可用于获取colorInt,然后将其提供给Jetpack Color类以获取androidx.ui.graphics.Color对象。

jdgnovmf

jdgnovmf3#

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

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

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

"#FF0000".color
carvr3hs

carvr3hs4#

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

xriantvc5#

不依赖于Android的解决方案如何?#KMP

val hashColorString = "#00AB18"
val color = Color(hashColorString.removePrefix("#").toLong(16) or 0x00000000FF000000)
ct3nt3jp

ct3nt3jp6#

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

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

elcex8rz7#

十六进制字符串到颜色[此扩展函数在android sdk内部可用]

Color("#FFFFFF".toColorInt())

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

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())
}

如果u也想要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())
        }
pu3pd22g

pu3pd22g8#

如果您不想导入android.graphics.Color,这里有另一个简单的方法:

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

在这种情况下,Color将直接是来自androidx.compose.ui.graphics.Color的一个。

相关问题