【问题标题】:Color from hex string in jetpack composejetpack compose 中十六进制字符串的颜色
【发布时间】:2020-05-31 12:02:36
【问题描述】:

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

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


当前解决方法: 从标准 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")
}

【问题讨论】:

  • 将十六进制字符串解析为Long。将 Long 传递给 Color() 函数。
  • @CommonsWare 尝试从标准 Color 类中导出 parseColor() 方法。目前它工作正常,但我认为jetpack compose 团队应该添加此方法。
  • @CommonsWare 也尝试了您的解决方案,但出现了java.lang.NumberFormatException 异常。
  • 如果你真的尝试解析#9CCC65,那将不起作用,因为# 不是数字的一部分。该算法几乎与您在parseColor() 中看到的一样。我不会争论 Compose 团队是否会像这样添加对颜色字符串的支持,但如果他们认为这超出了范围并且可以由应用程序或其他一些非 Compose 库轻松处理,我也不会感到惊讶.
  • @CommonsWare 是的,你明白了。谢谢!

标签: android android-jetpack-compose


【解决方案1】:

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

val PrimaryBlue = Color(0xFF9CCC65)

【讨论】:

  • 这个答案与在运行时明确提到将字符串解析为颜色的问题无关。
  • 对不起,我没有看到任何我们必须在运行时解析的地方
  • 这个答案是最好的,因为我一直在寻找这个解决方案,我首先来到了这个问题。
【解决方案2】:

您可以将此对象类与 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 的 android.graphics.Color 访问 parseColor() 方法。

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

【讨论】:

  • 或者您可以在项目中添加扩展功能。 fun Color.fromHex(color: String) = Color(android.graphics.Color.parseColor("#" + colorString))
  • @facundomr 好吧,您应该使用 Color.Companion 而不是仅仅使用 Color,以 Color.fromString() 形式使用它。
【解决方案3】:

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

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

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

"#FF0000".color

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

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

          Color 在这种情况下将立即是来自androidx.compose.ui.graphics.Color 的那个。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-12
            • 2012-11-01
            • 1970-01-01
            • 2012-11-24
            相关资源
            最近更新 更多