Comment convertir un entier de couleur en une chaîne hexadécimale dans Android?

195

J'ai un entier qui a été généré à partir d'un android.graphics.Color

Le nombre entier a une valeur de -16776961

Comment convertir cette valeur en une chaîne hexadécimale au format #RRGGBB

Autrement dit: je voudrais sortir # 0000FF de -16776961

Remarque: je ne veux pas que la sortie contienne un alpha et j'ai également essayé cet exemple sans succès

Bosah Chude
la source
Sur quoi essayez-vous d'activer la couleur hexadécimale? Je pense qu'il y a une réponse différente ici
Blundell
@Blundell Exporte la couleur vers une application externe. La couleur doit être dans ce format #RRGGBB
Bosah Chude
Alors, quel est le problème avec developer.android.com/reference/android/content/res/… ? Vous devrez coller l'URL ou faire défiler jusqu'à getColor (int)
Blundell
Suis les entiers bruts. Les valeurs ne proviennent pas d'un widget de ressources
Bosah Chude

Réponses:

471

Le masque garantit que vous n'obtenez que RRGGBB, et le% 06X vous donne un hexadécimal zéro (toujours 6 caractères):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
Josh
la source
3
Cela a parfaitement fonctionné, merci! Plus simple et plus précis que d'essayer d'utiliser la sous-chaîne sur Integer.toHexString ().
Tom
7
Je viens de réaliser qu'il existe une méthode Color.parseColor (String hex) qui fait exactement ce que je demande.
Marcel Bro
4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh
5
N'utilisez pas cette réponse si votre couleur utilise l'alpha. Tu vas le perdre.
Simon
5
@Simon, pour rendre cet alpha prêt, il suffit de retirer le masque et de changer 6 en 8. Notez qu'OP a demandé de rejeter alpha.
TWiStErRob
54

Essayez Integer.toHexString ()

Source: En Java, comment puis-je convertir un tableau d'octets en une chaîne de chiffres hexadécimaux tout en conservant les zéros en tête?

ming_codes
la source
7
Cette réponse conserve l'alpha de la couleur
Bosah Chude
3
Eh bien, si vous voulez vous débarrasser de l'alpha, créez simplement un masque de bit pour cela: Integer.toHexString (value & 0x00FFFFFF)
ming_codes
3
Le type Java int fait 4 octets. Selon la documentation android.graphics.Color, l'octet le plus à gauche est le canal alpha. En utilisant une opération ET peu sage avec la valeur 0x00FFFFFF, vous effacez essentiellement l'octet le plus à gauche (canal alpha) à 0. Lorsqu'il est utilisé avec Integer.toHexString, il ne restera que le reste des 3 octets dans String. Tous les chiffres non significatifs seront supprimés de l'appel, donc si vous voulez les zéros de tête, vous devrez peut-être ajouter cela en vous-même.
ming_codes
1
Ne fonctionne pas pour 0x000000FF, ou 0xFF0000FFsi vous supprimez l'alpha.
TWiStErRob
26

Je crois que j'ai trouvé la réponse, ce code convertit l'entier en une chaîne hexadécimale et supprime l'alpha.

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

Notez que n'utilisez ce code que si vous êtes sûr que la suppression de l'alpha n'affectera rien.

Bosah Chude
la source
1
Si vous envoyez 0x00FFFFFFpar ce biais, il se bloquera Color.parseColor.
TWiStErRob
9

Voici ce que j'ai fait

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

Merci les gars, vos réponses ont fait le truc

Diljeet
la source
La première variante ne fonctionne pas pour 0x00FFFFFF-> "FFFFFF" (pas d'alpha). La deuxième variante ne fonctionne pas pour 0x00000FFF-> "F" (bits manquants).
TWiStErRob
@TWiStErRob avez-vous une solution qui fonctionne de manière fiable pour les couleurs avec canal alpha?
Saket
2
@Saket La variante de la meilleure réponse devrait:String.format("#%08X", intColor)
TWiStErRob
@TWiStErRob Ah, viens de voir votre commentaire sous la réponse du haut. Merci!
Saket
5

Valeur entière de la couleur ARGB en chaîne hexadécimale:

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

Chaîne hexadécimale à la valeur entière de la couleur ARGB:

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

Avec cette méthode Integer.toHexString , vous pouvez avoir une exception de couleur inconnue pour certaines couleurs lorsque vous utilisez Color.parseColor.

Et avec cette méthode String.format ("#% 06X", (0xFFFFFF & intColor)) , vous perdrez la valeur alpha.

Je recommande donc cette méthode:

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
la source
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
la source
0

Si vous utilisez, Integer.toHexStringvous vous retrouverez avec des zéros manqués lorsque vous convertirez des couleurs comme 0xFF000123. Voici ma solution basée sur kotlin qui ne nécessite ni classes spécifiques Android ni Java. Vous pouvez donc également l'utiliser dans un projet multiplateforme:

    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
la source