Farbe aus Hex-String in Jetpack-Komposition

Lesezeit: 4 Minuten

Benutzeravatar von Vipul Asri
Vipul Asri

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

Benutzeravatar von burkinafaso3741
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"))

Benutzeravatar von Majkeee
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

Benutzeravatar von Tob237
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

Benutzeravatar von Abhijith mogaveera
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())
}

1435880cookie-checkFarbe aus Hex-String in Jetpack-Komposition

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy