Como converter um número inteiro de cores em uma string hexadecimal no Android?


195

Eu tenho um número inteiro que foi gerado a partir de um android.graphics.Color

O número inteiro tem um valor de -16776961

Como converter esse valor em uma sequência hexadecimal com o formato #RRGGBB

Simplificando: eu gostaria de enviar # 0000FF a partir de -16776961

Nota: Eu não quero que a saída contenha um alfa e também tentei este exemplo sem êxito


Em que você está tentando definir a cor hexagonal? Eu acho que há uma resposta diferente aqui
Blundell

@Blundell Estou exportando a cor para um aplicativo externo. A cor precisa estar neste formato #RRGGBB
Bosah Chude

Então, o que há de errado com developer.android.com/reference/android/content/res/… ? Você precisará colar o URL ou rolar para getColor (int)
Blundell

Estou recebendo os números inteiros brutos. Os valores não são de um widget de recurso
Bosah Chude

Respostas:


471

A máscara garante que você obtenha apenas RRGGBB, e o% 06X fornece hexadecimal com preenchimento zero (sempre com 6 caracteres):

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

3
Isso funcionou perfeitamente, obrigado! Mais fácil e preciso do que tentar usar substring em Integer.toHexString ().
Tom

7
Acabei de perceber que existe o método Color.parseColor (String hex) que faz exatamente o que estou pedindo.
Marcel Bro

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

5
Não use esta resposta se sua cor usa alfa. Você vai perdê-lo.
Simon

5
@ Simon, para tornar esse alfa pronto, remova a máscara e altere de 6 para 8. Observe que o OP pediu para descartar o alfa.
TWiStErRob 4/18

54

7
Esta resposta mantém o alfa da cor
Bosah Chude

3
Bem, se você quiser se livrar do alfa, basta criar uma máscara de bits para ele: Integer.toHexString (value & 0x00FFFFFF)
ming_codes

3
O tipo Java int possui 4 bytes. De acordo com a documentação do android.graphics.Color, o byte mais à esquerda é o canal alfa. Usando uma operação AND um pouco inteligente, com o valor 0x00FFFFFF, você basicamente limpa o byte mais à esquerda (canal alfa) para 0. Quando usado com Integer.toHexString, ele deixa o restante dos 3 bytes em String. Todos os dígitos não significativos serão eliminados da chamada; portanto, se você quiser os zeros à esquerda, talvez seja necessário anexá-lo a si próprio.
ming_codes

1
Não funciona 0x000000FFou 0xFF0000FFse você remover o alfa.
TWiStErRob 23/09

26

Eu acredito que encontrei a resposta, este código converte o número inteiro em uma sequência hexadecimal e remove o alfa.

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

Observe apenas esse código se tiver certeza de que a remoção do alfa não afetaria nada.


1
Se você enviar 0x00FFFFFFisso, ele falhará Color.parseColor.
TWiStErRob 23/09/19

9

Aqui está o que eu fiz

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

Obrigado pessoal vocês respostas fizeram a coisa


A primeira variante não funciona para 0x00FFFFFF-> "FFFFFF" (sem alfa). A segunda variante não funciona para 0x00000FFF-> "F" (bits ausentes).
TWiStErRob 23/09

@TWiStErRob você criou uma solução que funciona de maneira confiável para cores com canal alfa?
Saket 04/02

2
@Saket variante A resposta superior deve:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ah, acabei de ver seu comentário na resposta superior. Obrigado!
Saket

5

Valor inteiro da cor ARGB em sequência hexadecimal:

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

Sequência hexadecimal para valor inteiro da cor ARGB:

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

4

Com este método Integer.toHexString , você pode ter uma exceção de cor Desconhecida para algumas cores ao usar Color.parseColor.

E com este método String.format ("#% 06X", (0xFFFFFF & intColor)) , você perderá o valor alfa.

Então, eu recomendo 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

Se você usar, Integer.toHexStringvocê terminará com zeros perdidos quando converter cores como 0xFF000123. Aqui está minha solução baseada no kotlin, que não requer nem classes específicas do android nem java. Então você também pode usá-lo no projeto 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.