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")
}
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
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.dp
puede 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"))
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
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
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())
}
Analizar la cadena hexadecimal en un
Long
. pasa esoLong
en elColor()
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
#9CCC65
eso no funcionará, como#
no es parte de un número. El algoritmo es más o menos lo que ves allí conparseColor()
. 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