So analysieren Sie Hex-Strings, z #9CCC65 in Farbe Klasse in Jetpack komponieren.
PS: Die Option scheint im Jetpack Compose-Paket zu fehlen
Aktuelle Problemumgehung:
Exportiert parseColor() Methode aus der Standardklasse Color.
@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")
}
Analysieren Sie die Hex-Zeichenfolge in a Long. Übergeben Sie das Long in die Color() Funktion.
– CommonsWare
16. Februar 2020 um 12:04 Uhr
@CommonsWare hat versucht, die parseColor() Methode aus der Standardklasse Color. Da es im Moment gut funktioniert, denke ich, dass das Jetpack-Compose-Team diese Methode hinzufügen sollte.
– Vipul Asri
16. Februar 2020 um 12:13 Uhr
@CommonsWare hat auch Ihre Lösung ausprobiert java.lang.NumberFormatException Ausnahme.
– Vipul Asri
16. Februar 2020 um 12:15 Uhr
Wenn Sie buchstäblich versucht haben, zu parsen #9CCC65das wird nicht funktionieren, wie # ist kein Teil einer Zahl. Der Algorithmus ist so ziemlich das, was Sie dort sehen parseColor(). Ich werde nicht bestreiten, ob das Compose-Team Unterstützung für Farbzeichenfolgen wie diese hinzufügt, aber ich wäre auch nicht überrascht, wenn sie entscheiden würden, dass dies außerhalb des Geltungsbereichs liegt und von Apps oder einer anderen Nicht-Compose-Bibliothek problemlos gehandhabt werden kann .
– CommonsWare
16. Februar 2020 um 12:40 Uhr
@CommonsWare ja, hast du verstanden. Vielen Dank!
– Vipul Asri
16. Februar 2020 um 12:42 Uhr
Anstatt als String zu übergeben, übergeben Sie ihn stattdessen als Hexadezimal. Zum Beispiel, wenn Sie dies möchten #9CCC65 Farbe einfach vorne entfernen # und ersetzen Sie es durch 0xFF. Beispiel
val PrimaryBlue = Color(0xFF9CCC65)
Diese Antwort ist nicht relevant, da die Frage eindeutig erwähnt wurde, um die Zeichenfolge zur Laufzeit als Farbe zu analysieren.
– Vipul Asri
2. Juni 2021 um 15:19 Uhr
Entschuldigung, ich habe nirgendwo gesehen, dass wir zur Laufzeit analysieren müssen
– Mayank Wadhwa
6. Juni 2021 um 8:39 Uhr
Diese Antwort ist die beste, weil ich nach dieser Lösung gesucht habe und zuerst auf diese Frage gekommen bin.
– Mutter
8. Oktober 2021 um 19:36 Uhr
Ich habe viel zu lange damit verbracht, nur um zu erkennen, dass ich 0x und nicht 0xff hinzugefügt habe … Sei nicht wie ich alle.
– JBest
27. April um 19:25 Uhr
burkinafaso3741
Sie können diese Objektklasse mit einer getColor-Methode verwenden.
object HexToJetpackColor {
fun getColor(colorString: String): Color {
return Color(android.graphics.Color.parseColor("#" + colorString))
}
}
Oder wir können eine Erweiterungsfunktion verwenden
fun Color.fromHex(color: String) = Color(android.graphics.Color.parseColor("#" + colorString))
Jetpack Color Klasse dh androidx.ui.graphics.Color Akzeptiert nur RGB, ARGB, ColorSpace und colorInt im Konstruktor. Sehen: Color.kt
hier greifen wir also direkt zu parseColor() Methode aus android.graphics.Color was colorInt zurückgibt.
Daher kann die parseColor () -Methode verwendet werden, um colorInt zu erhalten und es dann der Jetpack Color-Klasse zur Verfügung zu stellen, um es zu erhalten androidx.ui.graphics.Color Objekt.
Oder vielleicht können Sie Ihrem Projekt eine Erweiterungsfunktion hinzufügen. Spaß Color.fromHex(color: String) = Color(android.graphics.Color.parseColor(“#” + colorString))
– Fakultätsr
10. September 2020 um 4:05 Uhr
@facundomr Nun, Sie sollten Color.Companion anstelle von nur Color verwenden, um es zu verwenden Color.fromString() bilden.
– Tura
2. Dezember 2021 um 12:57 Uhr
Ähnlich zu Int.dpEs kann geben String.color Erweiterungseigenschaft.
val String.color
get() = Color(android.graphics.Color.parseColor(this))
Dies kann als Mitgliedereigenschaft für Farbhex verwendet werden String.
"#FF0000".color
Eine andere Möglichkeit besteht darin, eine Erweiterungsfunktion zu schreiben, die der Funktionsweise von android.graphics.Color ähnelt:
import androidx.compose.ui.graphics.Color
fun Color.Companion.parse(colorString: String): Color =
Color(color = android.graphics.Color.parseColor(colorString))
Dann können Sie Ihre Komposition wie folgt schreiben:
Modifier.background(Color.parse("#FF0000"))
Majkeee
Wie wäre es mit einer Lösung, die nicht von Android abhängig ist? #KMP
val hashColorString = "#00AB18"
val color = Color(hashColorString.removePrefix("#").toLong(16) or 0x00000000FF000000)
Das funktioniert nicht. Versuchen Sie es mit “#FFFFFF” und Sie werden nicht weiß.
– Bartek
8. Juli um 6:40 Uhr
Sie haben Recht. Ich habe es repariert 🙂
– Majkeee
8. Juli um 11:23 Uhr
Tob237
Ich hatte auch dieses Problem und habe endlich die Lösung gefunden:
val myColorString = "#B00020"
val myComposeColorInt = Color(myColorString.toColorInt())
Das funktioniert nicht. Versuchen Sie es mit “#FFFFFF” und Sie werden nicht weiß.
– Bartek
8. Juli um 6:40 Uhr
Sie haben Recht. Ich habe es repariert 🙂
– Majkeee
8. Juli um 11:23 Uhr
Abhijith mogaveera
Hex-String zum Färben [this extension function is available inside android sdk
]
Color("#FFFFFF".toColorInt())
falls Sie wieder in Hex-Code konvertieren möchten
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())
}
14358800cookie-checkFarbe aus Hex-String in Jetpack-Kompositionyes
Analysieren Sie die Hex-Zeichenfolge in a
Long
. Übergeben Sie dasLong
in dieColor()
Funktion.– CommonsWare
16. Februar 2020 um 12:04 Uhr
@CommonsWare hat versucht, die
parseColor()
Methode aus der Standardklasse Color. Da es im Moment gut funktioniert, denke ich, dass das Jetpack-Compose-Team diese Methode hinzufügen sollte.– Vipul Asri
16. Februar 2020 um 12:13 Uhr
@CommonsWare hat auch Ihre Lösung ausprobiert
java.lang.NumberFormatException
Ausnahme.– Vipul Asri
16. Februar 2020 um 12:15 Uhr
Wenn Sie buchstäblich versucht haben, zu parsen
#9CCC65
das wird nicht funktionieren, wie#
ist kein Teil einer Zahl. Der Algorithmus ist so ziemlich das, was Sie dort sehenparseColor()
. Ich werde nicht bestreiten, ob das Compose-Team Unterstützung für Farbzeichenfolgen wie diese hinzufügt, aber ich wäre auch nicht überrascht, wenn sie entscheiden würden, dass dies außerhalb des Geltungsbereichs liegt und von Apps oder einer anderen Nicht-Compose-Bibliothek problemlos gehandhabt werden kann .– CommonsWare
16. Februar 2020 um 12:40 Uhr
@CommonsWare ja, hast du verstanden. Vielen Dank!
– Vipul Asri
16. Februar 2020 um 12:42 Uhr