Color de cadena hexagonal en jetpack componer

4 minutos de lectura

Avatar de usuario de Vipul Asri
Vipul Asri

Cómo analizar una cadena hexadecimal, por ejemplo #9CCC65 en Color clase en jetpack componer.

PD: parece que falta la opción en el paquete de composición jetpack


Solución alternativa actual:
Exportado parseColor() método de la clase Color estándar.

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

  • Analizar la cadena hexadecimal en un Long. pasa eso Long en el Color() función.

    – CommonsWare

    16 de febrero de 2020 a las 12:04

  • @CommonsWare intentó exportar el parseColor() método de la clase Color estándar. Como funciona bien por ahora, pero creo que el equipo de composición de jetpack debería agregar este método.

    – Vipul Asri

    16 de febrero de 2020 a las 12:13

  • @CommonsWare también probó su solución, teniendo java.lang.NumberFormatException excepción.

    – Vipul Asri

    16 de febrero de 2020 a las 12:15

  • Si literalmente intentaste analizar #9CCC65eso no funcionará, como # no es parte de un número. El algoritmo es más o menos lo que ves allí con parseColor(). No discutiré si el equipo de Compose agrega soporte para cadenas de colores como esta, pero tampoco me sorprendería si deciden que esto está fuera del alcance y que las aplicaciones o alguna otra biblioteca que no sea de Compose pueden manejarlo fácilmente. .

    – CommonsWare

    16 de febrero de 2020 a las 12:40

  • @CommonsWare sí entendió su punto. ¡Gracias!

    – Vipul Asri

    16 de febrero de 2020 a las 12:42

En lugar de pasar como Cadena, pase como Hexadecimal. Por ejemplo, si quieres esto #9CCC65 Color solo quita el frente # y reemplácelo con 0xFF. Ejemplo

val PrimaryBlue = Color(0xFF9CCC65)

  • Esta respuesta no es relevante ya que la pregunta se menciona claramente para analizar la cadena como color en tiempo de ejecución.

    – Vipul Asri

    2 de junio de 2021 a las 15:19

  • lo siento, no vi ningún lugar que tengamos que analizar en tiempo de ejecución

    – Mayank Wadhwa

    6 de junio de 2021 a las 8:39

  • Esta respuesta es la mejor, porque estaba buscando esta solución y llegué a esta pregunta primero.

    – mamá

    8 oct 2021 a las 19:36

  • Pasé demasiado tiempo en esto solo para darme cuenta de que estaba agregando 0x y no 0xff … No sean como yo todos.

    – JBest

    27 abr a las 19:25

Avatar de usuario de burkinafaso3741
burkinafaso3741

Puede usar esta clase de objeto con un método getColor.

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

O podemos usar una función de extensión

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

Clase de color Jetpack, es decir androidx.ui.graphics.Color solo toma RGB, ARGB, ColorSpace y colorInt en el constructor. Ver: Color.kt

entonces, aquí estamos accediendo directamente parseColor() método de android.graphics.Color que devuelve colorInt.

Por lo tanto, el método parseColor() se puede usar para obtener colorInt y luego proporcionarlo a la clase Jetpack Color para obtener androidx.ui.graphics.Color objeto.

  • O tal vez pueda agregar una función de extensión en su proyecto. divertido Color.fromHex(color: Cadena) = Color(android.graphics.Color.parseColor(“#” + colorString))

    – facundomr

    10 de septiembre de 2020 a las 4:05

  • @facundomr Bueno, deberías usar Color.Companion en lugar de solo Color, para usarlo en Color.fromString() forma.

    – Tura

    2 de diciembre de 2021 a las 12:57

Similar a Int.dppuede haber String.color propiedad de extensión.

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

Esto se puede usar como propiedad de miembro en color hexadecimal String.

"#FF0000".color

Otra opción es escribir una función de extensión similar a cómo funciona android.graphics.Color:

import androidx.compose.ui.graphics.Color

fun Color.Companion.parse(colorString: String): Color =
    Color(color = android.graphics.Color.parseColor(colorString))

Entonces puedes escribir tu composición así:

Modifier.background(Color.parse("#FF0000"))

Avatar de usuario de Majkeee
Majkeee

¿Qué tal una solución que no dependa de Android? #KMP

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

  • esto no funciona Pruébalo con “#FFFFFF” y no te saldrá blanco.

    – Bartek

    8 de julio a las 6:40

  • Tienes razón. Lo arreglé 🙂

    – Majkeee

    8 de julio a las 11:23

Avatar de usuario de Tob237
tob237

También tuve este problema y finalmente encontré la solución:

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

  • esto no funciona Pruébalo con “#FFFFFF” y no te saldrá blanco.

    – Bartek

    8 de julio a las 6:40

  • Tienes razón. Lo arreglé 🙂

    – Majkeee

    8 de julio a las 11:23

Avatar de usuario de Abhijith mogaveera
Abhijith mogaveera

cadena hexadecimal para colorear [this extension function is available inside android sdk
]

Color("#FFFFFF".toColorInt())

en caso de que quieras volver a convertir a código hexadecimal

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

¿Ha sido útil esta solución?