Jetpack Compose 中十六进制字符串的颜色
Color from hex string in jetpack compose
如何解析十六进制字符串,例如#9CCC65
在 Color 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
.
的那个
如何解析十六进制字符串,例如#9CCC65
在 Color 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
.