Bagaimana cara mengubah integer warna ke hex String di Android?

195

Saya memiliki bilangan bulat yang dihasilkan dari sebuah android.graphics.Color

Integer memiliki nilai -16776961

Bagaimana cara mengubah nilai ini menjadi string hex dengan format #RRGGBB

Sederhananya: Saya ingin menampilkan # 0000FF dari -16776961

Catatan: Saya tidak ingin output mengandung alfa dan saya juga sudah mencoba contoh ini tanpa hasil

Bosah Chude
sumber
Apa yang Anda coba atur warna hex? Saya pikir ada jawaban yang berbeda di sini
Blundell
@ Blundell Saya mengekspor warna ke aplikasi eksternal. Warna harus dalam format ini #RRGGBB
Bosah Chude
Jadi apa yang salah dengan developer.android.com/reference/android/content/res/… ? Anda harus menempelkan url atau gulir ke getColor (int)
Blundell
Saya mendapatkan bilangan bulat mentah. Nilai-nilai ini bukan dari widget sumber daya
Bosah Chude

Jawaban:

471

Topeng memastikan Anda hanya mendapatkan RRGGBB, dan% 06X memberi Anda hex berlapis nol (selalu 6 karakter):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
Josh
sumber
3
Ini bekerja dengan baik, terima kasih! Lebih mudah dan lebih akurat daripada mencoba menggunakan substring pada Integer.toHexString ().
Tom
7
Saya baru saja menyadari ada metode Color.parseColor (String hex) yang tidak persis apa yang saya minta.
Marcel Bro
4
int colorInt = 0xff000000 | Integer.parseInt (hexString, 16);
Josh
5
Jangan gunakan jawaban ini jika warna Anda menggunakan alpha. Anda akan kehilangan itu.
Simon
5
@Simon, untuk membuat alpha-ready ini cukup lepaskan topeng dan ubah 6 menjadi 8. Perhatikan bahwa OP meminta pemberhentian alpha.
TWiStErRob
54

Coba Integer.toHexString ()

Sumber: Di Jawa, bagaimana cara mengubah array byte ke string angka hex sambil tetap memimpin nol?

ming_codes
sumber
7
Jawaban ini mempertahankan alfa warna
Bosah Chude
3
Nah, jika Anda ingin menghilangkan alpha, cukup buat topeng bit untuknya: Integer.toHexString (value & 0x00FFFFFF)
ming_codes
3
Tipe Java int adalah 4 byte. Menurut dokumentasi android.graphics.Color, byte paling kiri adalah saluran alpha. Dengan menggunakan operasi AND sedikit bijak dengan nilai 0x00FFFFFF, Anda pada dasarnya menghapus byte paling kiri (saluran alpha) ke 0. Ketika digunakan dengan Integer.toHexString, itu hanya akan meninggalkan sisa 3 byte dalam String. Semua angka yang tidak signifikan akan dikeluarkan dari panggilan, jadi jika Anda menginginkan nol di depannya, Anda mungkin harus menambahkannya di dalam diri Anda.
ming_codes
1
Tidak bekerja untuk 0x000000FF, atau 0xFF0000FFjika Anda menghapus alpha.
TWiStErRob
26

Saya percaya saya telah menemukan jawabannya, Kode ini mengubah bilangan bulat menjadi string hex dan menghapus alpha.

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

Catatan hanya menggunakan kode ini jika Anda yakin bahwa menghapus alpha tidak akan mempengaruhi apa pun.

Bosah Chude
sumber
1
Jika Anda mengirim 0x00FFFFFFini akan crash Color.parseColor.
TWiStErRob
9

Inilah yang saya lakukan

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

Terima kasih kawan, jawaban Anda berhasil

Diljeet
sumber
Varian pertama tidak berfungsi untuk 0x00FFFFFF-> "FFFFFF" (tanpa alfa). Varian kedua tidak berfungsi untuk 0x00000FFF-> "F" (bit yang hilang).
TWiStErRob
@TWiStErRob apakah Anda solusi yang andal bekerja untuk warna dengan saluran alpha?
Saket
2
@Saket Varian jawaban teratas harus:String.format("#%08X", intColor)
TWiStErRob
@TWiStErRob Ah, baru saja melihat komentar Anda di bawah jawaban teratas. Terima kasih!
Saket
5

Nilai integer warna ARGB ke string heksadesimal:

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

String heksadesimal untuk nilai integer warna ARGB:

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

Dengan metode ini Integer.toHexString , Anda dapat memiliki pengecualian warna tidak dikenal untuk beberapa warna saat menggunakan Color.parseColor.

Dan dengan metode ini String.format ("#% 06X", (0xFFFFFF & intColor)) , Anda akan kehilangan nilai alpha.

Jadi saya merekomendasikan metode ini:

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
sumber
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
sumber
0

Jika Anda menggunakan, Integer.toHexStringAnda akan berakhir dengan nol yang terlewatkan saat Anda mengonversi warna suka 0xFF000123. Ini adalah solusi berbasis kotlin saya yang tidak memerlukan kelas khusus android maupun java. Jadi Anda bisa menggunakannya di proyek multi platform juga:

    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
sumber