Jak przekonwertować liczbę całkowitą koloru na ciąg szesnastkowy w systemie Android?

196

Mam liczbę całkowitą, która została wygenerowana z android.graphics.Color

Liczba całkowita ma wartość -16776961

Jak przekonwertować tę wartość na ciąg szesnastkowy w formacie #RRGGBB

Po prostu: chciałbym wypisać # 0000FF z -16776961

Uwaga: nie chcę, aby dane wyjściowe zawierały alfa, i spróbowałem tego przykładu bez powodzenia

Bosah Chude
źródło
Na czym próbujesz ustawić kolor heksadecymalny? Myślę, że jest tu inna odpowiedź
Blundell,
@Blundell Am eksportuje kolor do aplikacji zewnętrznej. Kolor musi być w tym formacie
#RRGGBB
Więc co jest nie tak z developer.android.com/reference/android/content/res/… ? Musisz wkleić adres URL lub przewinąć, aby uzyskać getColor (int)
Blundell
Dostaję surowe liczby całkowite. Wartości nie pochodzą z widżetu zasobów
Bosah Chude

Odpowiedzi:

471

Maska zapewnia, że ​​dostaniesz tylko RRGGBB, a% 06X daje heks z zerową wartością (zawsze 6 znaków):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
Josh
źródło
3
To działało idealnie, dziękuję! Łatwiej i dokładniej niż próba użycia podłańcucha na Integer.toHexString ().
Tom
7
Właśnie zdałem sobie sprawę, że istnieje metoda Color.parseColor (String hex), która robi dokładnie to, o co proszę.
Marcel Bro
4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh
5
Nie używaj tej odpowiedzi, jeśli kolor używa alfa. Stracisz to.
Simon
5
@ Simon, aby ten alfa był gotowy, po prostu usuń maskę i zmień 6 na 8. Zauważ, że OP poprosił o oddalenie alfa.
TWiStErRob
54

Wypróbuj Integer.toHexString ()

Źródło: W Javie, jak przekonwertować tablicę bajtów na ciąg cyfr szesnastkowych, zachowując początkowe zera?

ming_codes
źródło
7
Ta odpowiedź zachowuje alfa koloru
Bosah Chude
3
Cóż, jeśli chcesz pozbyć się alfy, po prostu stwórz dla niej maskę bitową: Integer.toHexString (wartość i 0x00FFFFFF)
ming_codes
3
Typ int Java ma 4 bajty. Zgodnie z dokumentacją android.graphics.Color, lewym bajtem jest kanał alfa. Używając nieco mądrej operacji AND z wartością 0x00FFFFFF, zasadniczo czyścisz lewy bajt (kanał alfa) do 0. W przypadku użycia z Integer.toHexString pozostawi resztę 3 bajtów w ciągu. Wszystkie nieistotne cyfry zostaną usunięte z połączenia, więc jeśli chcesz mieć zera na początku, być może będziesz musiał zapisać to w sobie.
ming_codes
1
Nie działa 0x000000FFlub 0xFF0000FFjeśli usuniesz alfa.
TWiStErRob
26

Wydaje mi się, że znalazłem odpowiedź. Ten kod konwertuje liczbę całkowitą na ciąg szesnastkowy i usuwa alfa.

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

Uwaga: użyj tego kodu tylko wtedy, gdy masz pewność, że usunięcie alfa nie wpłynie na nic.

Bosah Chude
źródło
1
Jeśli prześlesz 0x00FFFFFFprzez to, nastąpi awaria Color.parseColor.
TWiStErRob
9

Oto co zrobiłem

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

Dzięki, chłopaki, że odpowiedzi zrobiliście

Diljeet
źródło
Pierwszy wariant nie działa dla 0x00FFFFFF-> „FFFFFF” (bez alfa). Drugi wariant nie działa dla 0x00000FFF-> „F” (brakujące bity).
TWiStErRob
@TWiStErRob czy masz rozwiązanie, które niezawodnie działa dla kolorów z kanałem alfa?
Saket
2
@Saket Najlepszy wariant odpowiedzi powinien:String.format("#%08X", intColor)
TWiStErRob
@TWiStErRob Ach, właśnie widziałem Twój komentarz pod pierwszą odpowiedzią. Dzięki!
Saket
5

Wartość całkowita koloru ARGB do ciągu szesnastkowego:

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

Szesnastkowy ciąg do wartości całkowitej koloru ARGB:

int color = (Integer.parseInt( hex.substring( 0,2 ), 16) << 24) + Integer.parseInt( hex.substring( 2 ), 16);
Styl-7
źródło
4

Dzięki tej metodzie Integer.toHexString możesz mieć wyjątek Nieznany kolor dla niektórych kolorów podczas korzystania z Color.parseColor.

I dzięki tej metodzie String.format („#% 06X”, (0xFFFFFF i intColor)) stracisz wartość alfa.

Więc polecam tę metodę:

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());
    }
Szymon
źródło
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
źródło
0

Jeśli użyjesz Integer.toHexString, skończysz z pominiętymi zerami podczas konwersji kolorów takich jak 0xFF000123. Oto moje rozwiązanie oparte na Kotlin, które nie wymaga ani klas Androida, ani Java. Możesz więc użyć go również w projekcie wieloplatformowym:

    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
źródło