Як конвертувати ціле число кольорів у шістнадцяткову рядок в Android?


197

У мене є ціле число, яке було створене з android.graphics.Color

Ціле число має значення -16776961

Як конвертувати це значення у шістнадцяткову рядок у форматі #RRGGBB

Простіше кажучи: я хотів би вивести # 0000FF з -16776961

Примітка: я не хочу, щоб вихід містив альфа, і я також спробував цей приклад без будь-якого успіху


Що ви намагаєтесь увімкнути шестигранний колір? Я думаю, тут є інша відповідь
Blundell

@Blundell Я експортую колір у зовнішній додаток. Колір повинен бути у такому форматі
#RRGGBB

Отже, що не так з developer.android.com/reference/android/content/res/… ? Вам доведеться вставити URL або прокрутити до getColor (int)
Блонделл

Отримую необроблені цілі числа. Значення не від ресурсного
власного

Відповіді:


472

Маска гарантує, що ви отримаєте лише RRGGBB, а% 06X дає вам шестигранник з нульовим розміром (завжди 6 символів):

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

3
Це спрацювало чудово, дякую! Простіше і точніше, ніж намагатися використовувати підрядку на Integer.toHexString ().
Том

7
Я щойно зрозумів, що існує метод Color.parseColor (String hex), який робить саме те, про що я прошу.
Marcel Bro

4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Джош

5
Не використовуйте цю відповідь, якщо у вашому кольорі використовується альфа. Ви його втратите.
Саймон

5
@Simon, щоб зробити це готовим до альфа просто зніміть маску та змініть 6 на 8. Зверніть увагу, що ОП попросив звільнення альфа.
TWiStErRob

54

7
Ця відповідь зберігає альфа кольору
Bosah Chude

3
Що ж, якщо ви хочете позбутися альфи, просто створіть для неї трохи маски: Integer.toHexString (значення & 0x00FFFFFF)
ming_codes

3
Тип int Java - 4 байти. Згідно з документацією на android.graphics.Color, найменший байт - це альфа-канал. Використовуючи трохи розумну операцію AND зі значенням 0x00FFFFFF, ви по суті очищає найменший байт (альфа-канал) до 0. При використанні Integer.toHexString він просто залишить решту 3-х байт у String. Усі несуттєві цифри будуть викинуті з виклику, тому, якщо ви хочете провідні нулі, вам, можливо, доведеться передбачити це в собі.
ming_codes

1
Не працює 0x000000FF, або 0xFF0000FFякщо ви видалите альфа.
TWiStErRob

26

Я вважаю, що я знайшов відповідь. Цей код перетворює ціле число в шістнадцятковий рядок і видаляє альфа.

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

Зауважте, використовуйте цей код лише тоді, коли ви впевнені, що видалення альфа нічого не вплине.


1
Якщо ви надішлете 0x00FFFFFFчерез це, воно вийде з ладу Color.parseColor.
TWiStErRob

9

Ось що я зробив

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

Спасибі, хлопці, ви відповіли, зробили це


Перший варіант не працює для 0x00FFFFFF-> "FFFFFF" (без альфа). Другий варіант не працює для 0x00000FFF-> "F" (відсутні біти).
TWiStErRob

@TWiStErRob Ви вирішили, що надійно працює для кольорів з альфа-каналом?
Сакет

2
@Saket Варіант верхньої відповіді повинен:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ага, щойно побачив ваш коментар під головною відповіддю. Дякую!
Сакет

5

Ціле значення ARGB кольору в шістнадцятковій рядку:

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

Шістнадцятковий рядок до цілого значення кольору ARGB:

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

4

За допомогою цього методу Integer.toHexString ви можете мати виняток невідомого кольору для деяких кольорів при використанні Color.parseColor.

І за допомогою цього методу String.format ("#% 06X", (0xFFFFFF & intColor)) ви втратите значення альфа.

Тому я рекомендую цей метод:

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

Якщо ви використовуєте, Integer.toHexStringви перетворите нульові нулі, коли перетворюєте такі кольори 0xFF000123. Ось моє рішення на основі kotlin, яке не вимагає ані Android-класів, ані Java. Таким чином, ви можете використовувати його і в мультиплатформенному проекті:

    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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.