Come convertire un numero intero di colore in una stringa esadecimale in Android?


195

Ho un numero intero che è stato generato da un android.graphics.Color

Il numero intero ha un valore di -16776961

Come faccio a convertire questo valore in una stringa esadecimale con il formato #RRGGBB

In poche parole: vorrei produrre # 0000FF da -16776961

Nota: non voglio che l'output contenga un alpha e ho anche provato questo esempio senza successo


Cosa stai cercando di impostare il colore esadecimale? Penso che ci sia una risposta diversa qui
Blundell,

@Blundell Sto esportando il colore in un'applicazione esterna. Il colore deve essere in questo formato #RRGGBB
Bosah Chude,

Quindi cosa c'è che non va in developer.android.com/reference/android/content/res/… ? Dovrai incollare l'URL o scorrere fino a getColor (int)
Blundell il

Sto ottenendo gli interi grezzi. I valori non provengono da un widget di risorse
Bosah Chude,

Risposte:


471

La maschera ti assicura solo di ottenere RRGGBB e% 06X ti dà un esagono a zero (sempre lungo 6 caratteri):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));

3
Questo ha funzionato perfettamente, grazie! Più semplice e preciso rispetto al tentativo di utilizzare la sottostringa su Integer.toHexString ().
Tom,

7
Ho appena realizzato che esiste il metodo Color.parseColor (String hex) che fa esattamente quello che sto chiedendo.
Marcel Bro

4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh,

5
Non usare questa risposta se il tuo colore usa l'alfa. Lo perderai.
Simon,

5
@Simon, per rendere questo alpha-ready basta rimuovere la maschera e cambiare da 6 a 8. Nota che OP ha chiesto di licenziare alpha.
TWiStErRob

54

7
Questa risposta mantiene l'alfa del colore
Bosah Chude,

3
Bene, se vuoi sbarazzarti dell'alfa, crea una maschera di bit: Integer.toHexString (value & 0x00FFFFFF)
ming_codes

3
Il tipo int Java è lungo 4 byte. Secondo la documentazione di android.graphics.Color, il byte più a sinistra è il canale alfa. Usando un'operazione AND leggermente saggia con il valore 0x00FFFFFF, essenzialmente si cancella il byte più a sinistra (canale alfa) su 0. Se usato con Integer.toHexString, lascerà semplicemente il resto dei 3 byte in String. Tutte le cifre non significative verranno eliminate dalla chiamata, quindi se si desidera lo zero iniziale, potrebbe essere necessario anteporre ciò in sé.
ming_codes

1
Non funziona per 0x000000FFo 0xFF0000FFse rimuovi l'alfa.
TWiStErRob,

26

Credo di aver trovato la risposta, questo codice converte l'intero in una stringa esadecimale e rimuove l'alfa.

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

Nota utilizzare questo codice solo se si è certi che la rimozione dell'alfa non influirà su nulla.


1
Se lo invii, 0x00FFFFFFsi bloccherà Color.parseColor.
TWiStErRob,

9

Ecco cosa ho fatto

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

Grazie ragazzi, le risposte hanno fatto la cosa


La prima variante non funziona per 0x00FFFFFF-> "FFFFFF" (no alpha). La seconda variante non funziona per 0x00000FFF-> "F" (bit mancanti).
TWiStErRob,

@TWiStErRob hai fatto una soluzione che funziona in modo affidabile per i colori con canale alfa?
Saket,

2
@Saket La variante della risposta migliore dovrebbe:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ah, ho appena visto il tuo commento sotto la risposta migliore. Grazie!
Saket,

5

Valore intero del colore ARGB in stringa esadecimale:

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

Stringa esadecimale al valore intero del colore ARGB:

int color = (Integer.parseInt( hex.substring( 0,2 ), 16) << 24) + Integer.parseInt( hex.substring( 2 ), 16);

4

Con questo metodo Integer.toHexString , è possibile avere un'eccezione di colore sconosciuta per alcuni colori quando si utilizza Color.parseColor.

E con questo metodo String.format ("#% 06X", (0xFFFFFF e intColor)) , perderai il valore alfa.

Quindi consiglio questo metodo:

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

0
String int2string = Integer.toHexString(INTEGERColor); //to ARGB
String HtmlColor = "#"+ int2string.substring(int2string.length() - 6, int2string.length()); // a stupid way to append your color

0

Se lo usi Integer.toHexStringfinirai con zero persi quando convertirai colori come 0xFF000123. Ecco la mia soluzione basata su kotlin che non richiede né classi specifiche per Android né Java. Quindi potresti usarlo anche nel progetto multipiattaforma:

    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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.