¿Cómo convertir un entero de color a una cadena hexadecimal en Android?


195

Tengo un número entero generado a partir de un android.graphics.Color

El número entero tiene un valor de -16776961

¿Cómo convierto este valor en una cadena hexadecimal con el formato #RRGGBB?

En pocas palabras: me gustaría generar # 0000FF desde -16776961

Nota: no quiero que la salida contenga un alfa y también he probado este ejemplo sin ningún éxito


¿En qué estás tratando de establecer el color hexadecimal? Creo que hay una respuesta diferente aquí
Blundell

@Blundell Estoy exportando el color a una aplicación externa. El color debe estar en este formato #RRGGBB
Bosah Chude

Entonces, ¿qué hay de malo con developer.android.com/reference/android/content/res/… ? Tendrá que pegar la URL o desplazarse para obtener Color (int)
Blundell

Estoy obteniendo los enteros crudos. Los valores no son de un widget de ow de recursos
Bosah Chude

Respuestas:


471

La máscara se asegura de que solo obtengas RRGGBB, y el% 06X te da un hexágono con relleno cero (siempre 6 caracteres de largo):

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

3
Esto funcionó perfectamente, gracias! Más fácil y más preciso que intentar usar la subcadena en Integer.toHexString ().
Tom

77
Me acabo de dar cuenta de que existe el método Color.parseColor (String hex) que hace exactamente lo que estoy pidiendo.
Marcel Bro

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

55
No use esta respuesta si su color usa alfa. Lo perderás
Simon

55
@ Simon, para que este alfa esté listo, simplemente quite la máscara y cambie de 6 a 8. Tenga en cuenta que OP pidió que se descartara el alfa.
TWiStErRob

54

77
Esta respuesta conserva el alfa del color
Bosah Chude

3
Bueno, si desea deshacerse de la alfa, simplemente cree una máscara de bits para ella: Integer.toHexString (value & 0x00FFFFFF)
ming_codes

3
El tipo int de Java tiene 4 bytes de longitud. Según la documentación de android.graphics.Color, el byte más antiguo es el canal alfa. Al usar una operación AND inteligente con el valor 0x00FFFFFF, esencialmente borra el byte más izquierdo (canal alfa) a 0. Cuando se usa con Integer.toHexString, solo dejará el resto de los 3 bytes en String. Todos los dígitos no significativos se eliminarán de la llamada, por lo que si desea los ceros iniciales, es posible que tenga que anteponer eso en usted mismo.
ming_codes

1
No funciona para 0x000000FF, o 0xFF0000FFsi elimina el alfa.
TWiStErRob

26

Creo que he encontrado la respuesta, este código convierte el entero en una cadena hexadecimal y elimina el alfa.

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

Tenga en cuenta que solo use este código si está seguro de que eliminar el alfa no afectaría nada.


1
Si envía 0x00FFFFFFesto, se bloqueará Color.parseColor.
TWiStErRob

9

Aquí esta lo que hice

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

Gracias chicos, sus respuestas hicieron lo


La primera variante no funciona para 0x00FFFFFF-> "FFFFFF" (sin alfa). La segunda variante no funciona para 0x00000FFF-> "F" (bits faltantes).
TWiStErRob

@TWiStErRob, ¿tuvo una solución que funcione de manera confiable para los colores con canal alfa?
Saket

2
@Saket La variante de la respuesta principal debería:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ah, acabo de ver tu comentario debajo de la respuesta superior. ¡Gracias!
Saket

5

Valor entero del color ARGB en cadena hexadecimal:

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

Cadena hexadecimal al valor entero del color ARGB:

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

4

Con este método Integer.toHexString , puede tener una excepción de color Desconocido para algunos colores al usar Color.parseColor.

Y con este método String.format ("#% 06X", (0xFFFFFF & intColor)) , perderá el valor alfa.

Entonces recomiendo este método:

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

Si lo usa Integer.toHexString, terminará con ceros perdidos cuando convierta colores como 0xFF000123. Aquí está mi solución basada en Kotlin que no requiere clases específicas de Android ni Java. Entonces también podría usarlo en proyectos multiplataforma:

    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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.