Wie konvertiere ich eine Farb-Ganzzahl in einen Hex-String in Android?

195

Ich habe eine Ganzzahl, die aus einem generiert wurde android.graphics.Color

Die Ganzzahl hat einen Wert von -16776961

Wie konvertiere ich diesen Wert in eine Hex-Zeichenfolge mit dem Format #RRGGBB?

Einfach ausgedrückt: Ich möchte # 0000FF von -16776961 ausgeben

Hinweis: Ich möchte nicht, dass die Ausgabe ein Alpha enthält, und ich habe dieses Beispiel auch ohne Erfolg ausprobiert

Bosah Chude
quelle
Auf was versuchst du die Hex-Farbe einzustellen? Ich denke, es gibt hier eine andere Antwort
Blundell
@Blundell Exportiere die Farbe in eine externe Anwendung. Die Farbe muss in diesem Format sein #RRGGBB
Bosah Chude
Was ist also los mit developer.android.com/reference/android/content/res/… ? Sie müssen die URL einfügen oder einen Bildlauf durchführen, um Farbe (int)
Blundell
Ich bekomme die rohen ganzen Zahlen. Die Werte stammen nicht aus einem Ressourcen-Widget
Bosah Chude

Antworten:

471

Die Maske stellt sicher, dass Sie nur RRGGBB erhalten, und% 06X gibt Ihnen null aufgefülltes Hex (immer 6 Zeichen lang):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
Josh
quelle
3
Das hat perfekt funktioniert, danke! Einfacher und genauer als der Versuch, Teilzeichenfolgen für Integer.toHexString () zu verwenden.
Tom
7
Ich habe gerade festgestellt, dass es die Color.parseColor-Methode (String hex) gibt, die genau das tut, wonach ich frage.
Marcel Bro
4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh
5
Verwenden Sie diese Antwort nicht, wenn Ihre Farbe Alpha verwendet. Du wirst es verlieren.
Simon
5
@ Simon, um dieses Alpha-fähig zu machen, entfernen Sie einfach die Maske und ändern Sie 6 in 8. Beachten Sie, dass OP darum gebeten hat, Alpha zu schließen.
TWiStErRob
54

Versuchen Sie Integer.toHexString ()

Quelle: Wie konvertiere ich in Java ein Byte-Array in eine Folge von Hex-Ziffern, während führende Nullen beibehalten werden?

ming_codes
quelle
7
Diese Antwort behält das Alpha der Farbe
Bosah Chude
3
Nun, wenn Sie das Alpha loswerden möchten, erstellen Sie einfach eine Bitmaske dafür: Integer.toHexString (Wert & 0x00FFFFFF)
ming_codes
3
Der Java-Int-Typ ist 4 Byte lang. Laut der Dokumentation von android.graphics.Color ist das linke Byte der Alphakanal. Wenn Sie eine bitweise UND-Verknüpfung mit dem Wert 0x00FFFFFF verwenden, löschen Sie im Wesentlichen das am weitesten links stehende Byte (Alpha-Kanal) auf 0. Bei Verwendung mit Integer.toHexString verbleiben nur die restlichen 3 Bytes in String. Alle nicht signifikanten Ziffern werden aus dem Anruf entfernt. Wenn Sie also die führenden Nullen möchten, müssen Sie dies möglicherweise in sich selbst voranstellen.
Ming_Codes
1
Funktioniert nicht für 0x000000FFoder 0xFF0000FFwenn Sie das Alpha entfernen.
TWiStErRob
26

Ich glaube, ich habe die Antwort gefunden. Dieser Code konvertiert die Ganzzahl in eine Hex-Zeichenfolge und entfernt das Alpha.

Integer intColor = -16895234;
String hexColor = "#" + Integer.toHexString(intColor).substring(2);

Beachten Sie, dass Sie diesen Code nur verwenden, wenn Sie sicher sind, dass das Entfernen des Alphas nichts beeinflusst.

Bosah Chude
quelle
1
Wenn Sie dies senden, 0x00FFFFFFwird es abstürzen Color.parseColor.
TWiStErRob
9

Hier ist was ich getan habe

 int color=//your color
 Integer.toHexString(color).toUpperCase();//upercase with alpha
 Integer.toHexString(color).toUpperCase().substring(2);// uppercase without alpha

Danke Jungs, deine Antworten haben das Ding gemacht

Diljeet
quelle
Die erste Variante funktioniert nicht für 0x00FFFFFF-> "FFFFFF" (kein Alpha). Die zweite Variante funktioniert nicht für 0x00000FFF-> "F" (fehlende Bits).
TWiStErRob
@TWiStErRob Haben Sie eine Lösung gefunden, die zuverlässig für Farben mit Alphakanal funktioniert?
Saket
2
@ Saket Die Variante der Top-Antwort sollte:String.format("#%08X", intColor)
TWiStErRob
@TWiStErRob Ah, habe gerade deinen Kommentar unter der Top-Antwort gesehen. Vielen Dank!
Saket
5

Ganzzahliger Wert der ARGB-Farbe zur hexadezimalen Zeichenfolge:

String hex = Integer.toHexString(color); // example for green color FF00FF00

Hexadezimaler String zum ganzzahligen Wert der ARGB-Farbe:

int color = (Integer.parseInt( hex.substring( 0,2 ), 16) << 24) + Integer.parseInt( hex.substring( 2 ), 16);
Style-7
quelle
4

Mit dieser Methode Integer.toHexString können Sie bei Verwendung von Color.parseColor für einige Farben eine Ausnahme für unbekannte Farben festlegen.

Und mit dieser Methode String.format ("#% 06X", (0xFFFFFF & intColor)) verlieren Sie den Alpha-Wert.

Daher empfehle ich diese Methode:

public static String ColorToHex(int color) {
        int alpha = android.graphics.Color.alpha(color);
        int blue = android.graphics.Color.blue(color);
        int green = android.graphics.Color.green(color);
        int red = android.graphics.Color.red(color);

        String alphaHex = To00Hex(alpha);
        String blueHex = To00Hex(blue);
        String greenHex = To00Hex(green);
        String redHex = To00Hex(red);

        // hexBinary value: aabbggrr
        StringBuilder str = new StringBuilder("#");
        str.append(alphaHex);
        str.append(blueHex);
        str.append(greenHex);
        str.append(redHex );

        return str.toString();
    }

    private static String To00Hex(int value) {
        String hex = "00".concat(Integer.toHexString(value));
        return hex.substring(hex.length()-2, hex.length());
    }
Simon
quelle
0
String int2string = Integer.toHexString(INTEGERColor); //to ARGB
String HtmlColor = "#"+ int2string.substring(int2string.length() - 6, int2string.length()); // a stupid way to append your color
Chundk
quelle
0

Wenn Sie verwenden, werden Integer.toHexStringSie beim Konvertieren von Farben wie mit fehlenden Nullen enden 0xFF000123. Hier ist meine Kotlin-basierte Lösung, die weder androidspezifische Klassen noch Java benötigt. Sie können es also auch in Multiplattform-Projekten verwenden:

    fun Int.toRgbString(): String =
        "#${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    fun Int.toArgbString(): String =
        "#${alpha.toStringComponent()}${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    private fun Int.toStringComponent(): String =
        this.toString(16).let { if (it.length == 1) "0${it}" else it }

    inline val Int.alpha: Int
        get() = (this shr 24) and 0xFF

    inline val Int.red: Int
        get() = (this shr 16) and 0xFF

    inline val Int.green: Int
        get() = (this shr 8) and 0xFF

    inline val Int.blue: Int
        get() = this and 0xFF
Oleksandr Albul
quelle