Làm cách nào để chuyển đổi một số nguyên màu thành Chuỗi hex trong Android?


195

Tôi có một số nguyên được tạo từ một android.graphics.Color

Số nguyên có giá trị -16776961

Làm cách nào để chuyển đổi giá trị này thành chuỗi hex với định dạng #RRGGBB

Nói một cách đơn giản: Tôi muốn xuất # 0000FF từ -16776961

Lưu ý: Tôi không muốn đầu ra chứa alpha và tôi cũng đã thử ví dụ này mà không thành công


Bạn đang cố gắng thiết lập màu hex là gì? Tôi nghĩ rằng có một câu trả lời khác nhau ở đây
Blundell

@Blundell Đang xuất màu sang một ứng dụng bên ngoài. Màu sắc cần phải ở định dạng này #RRGGBB
Bosah Chude

Vậy có vấn đề gì với developer.android.com/reference/android/content/res/ ,? Bạn sẽ phải dán url hoặc cuộn để getColor (int)
Blundell

Đang nhận được số nguyên thô. Các giá trị không phải từ một tiện ích
nợ

Câu trả lời:


471

Mặt nạ đảm bảo bạn chỉ nhận RRGGBB và% 06X cung cấp cho bạn hex không đệm (luôn luôn dài 6 ký tự):

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

3
Điều này làm việc hoàn hảo, cảm ơn bạn! Dễ dàng và chính xác hơn so với việc cố gắng sử dụng chuỗi con trên Integer.toHexString ().
Tom

7
Tôi mới nhận ra có phương thức Color.parseColor (Chuỗi hex) thực hiện chính xác những gì tôi đang yêu cầu.
Marcel Bro

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

5
Đừng sử dụng câu trả lời này nếu màu của bạn sử dụng alpha. Bạn sẽ mất nó.
Simon

5
@Simon, để làm cho alpha sẵn sàng này, chỉ cần gỡ mặt nạ và thay đổi 6 thành 8. Lưu ý rằng OP đã yêu cầu loại bỏ alpha.
TWiStErRob

54

7
Câu trả lời này giữ lại alpha của màu sắc
Bosah Chude

3
Chà, nếu bạn muốn thoát khỏi alpha, chỉ cần tạo mặt nạ bit cho nó: Integer.toHexString (value & 0x00FFFFFF)
ming_codes

3
Kiểu int Java dài 4 byte. Theo tài liệu của android.graphics.Color, byte bên trái là kênh alpha. Bằng cách sử dụng thao tác AND khôn ngoan với giá trị 0x00FFFFFF, về cơ bản, bạn sẽ xóa byte (kênh alpha) bên trái nhất về 0. Khi được sử dụng với Integer.toHexString, nó sẽ chỉ còn lại 3 byte trong Chuỗi. Tất cả các chữ số không có ý nghĩa sẽ bị loại bỏ khỏi cuộc gọi, vì vậy nếu bạn muốn các số 0 đứng đầu, bạn có thể phải tự trả trước số đó.
ming_codes

1
Không hoạt động 0x000000FFhoặc 0xFF0000FFnếu bạn loại bỏ alpha.
TWiStErRob

26

Tôi tin rằng tôi đã tìm thấy câu trả lời, Mã này chuyển đổi số nguyên thành chuỗi hex và loại bỏ alpha.

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

Lưu ý chỉ sử dụng mã này nếu bạn chắc chắn rằng việc xóa alpha sẽ không ảnh hưởng gì.


1
Nếu bạn gửi 0x00FFFFFFqua nó, nó sẽ sụp đổ Color.parseColor.
TWiStErRob

9

Đây là những gì tôi đã làm

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

Cảm ơn những người bạn đã trả lời


Biến thể đầu tiên không hoạt động cho 0x00FFFFFF-> "FFFFFF" (không có alpha). Biến thể thứ hai không hoạt động cho 0x00000FFF-> "F" (thiếu bit).
TWiStErRob

@TWiStErRob bạn có giải pháp nào đáng tin cậy cho màu sắc với kênh alpha không?
Saket

2
@Saket Biến thể của câu trả lời hàng đầu nên:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob Ah, chỉ cần thấy bình luận của bạn dưới câu trả lời hàng đầu. Cảm ơn!
Saket

5

Giá trị nguyên của màu ARGB cho chuỗi thập lục phân:

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

Chuỗi thập lục phân đến giá trị nguyên của màu ARGB:

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

4

Với phương thức này Integer.toHexString , bạn có thể có ngoại lệ màu Không xác định đối với một số màu khi sử dụng Color.parseColor.

Và với phương thức này String.format ("#% 06X", (0xFFFFFF & intColor)) , bạn sẽ mất giá trị alpha.

Vì vậy, tôi khuyên bạn nên phương pháp này:

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

Nếu bạn sử dụng, Integer.toHexStringbạn sẽ kết thúc với các số không bị bỏ lỡ khi bạn chuyển đổi màu sắc như thế nào 0xFF000123. Đây là giải pháp dựa trên kotlin của tôi mà không yêu cầu cả các lớp cụ thể của Android cũng như java. Vì vậy, bạn cũng có thể sử dụng nó trong dự án đa nền tảng:

    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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.