วิธีการแปลงจำนวนเต็มสีเป็นสตริงฐานสิบหกใน Android


197

ฉันมีจำนวนเต็มที่สร้างจาก android.graphics.Color

จำนวนเต็มมีค่า -16776961

ฉันจะแปลงค่านี้เป็นสตริงฐานสิบหกด้วยรูปแบบ #RRGGBB ได้อย่างไร

ใส่เพียง: ฉันต้องการที่จะส่งออก # 0000FF จาก -16776961

หมายเหตุ:ฉันไม่ต้องการให้เอาต์พุตมีอัลฟ่าและฉันได้ลองตัวอย่างนี้โดยไม่ประสบความสำเร็จ


คุณพยายามตั้งค่าสีฐานสิบหกเป็นอย่างไร ฉันคิดว่ามีคำตอบที่แตกต่างกันที่นี่
Blundell

@ Blundell กำลังส่งออกสีไปยังแอปพลิเคชันภายนอก สีต้องอยู่ในรูปแบบนี้ #RRGGBB
Bosah Chude

ดังนั้นมีอะไรผิดปกติกับ developer.android.com/reference/android/content/res/… ? คุณจะต้องวาง url หรือเลื่อนไปที่ getColor (int)
Blundell

กำลังรับจำนวนเต็มดิบ ค่าเหล่านี้ไม่ได้มาจากวิดเจ็ต ow แหล่ง
Bosah Chude

คำตอบ:


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);
Josh

5
อย่าใช้คำตอบนี้ถ้าสีของคุณใช้อัลฟ่า คุณจะสูญเสียมัน
Simon

5
@Simon เพื่อให้อัลฟ่าพร้อมใช้งานเพียงแค่ลบหน้ากากและเปลี่ยน 6 เป็น 8 โปรดทราบว่า OP ขอให้ยกเลิกอัลฟ่า
TWiStErRob

54

7
คำตอบนี้จะรักษาอัลฟาของสี
Bosah Chude

3
ถ้าคุณต้องการกำจัดอัลฟ่าเพียงแค่สร้าง mask bit สำหรับมัน: Integer.toHexString (ค่า & 0x00FFFFFF)
ming_codes

3
Java int type มีความยาว 4 ไบต์ ตามเอกสารของ android.graphics.Color ไบต์ที่เหลือคือช่องอัลฟา โดยการใช้บิตที่ชาญฉลาดและการดำเนินการกับค่า 0x00FFFFFF คุณจำเป็นต้องลบไบต์ที่เหลือที่สุด (ช่องอัลฟา) เป็น 0 เมื่อใช้กับ Integer.toHexString มันจะเหลือ 3 ไบต์ที่เหลือในสตริง ตัวเลขที่ไม่มีนัยสำคัญทั้งหมดจะถูกดร็อปจากการโทรดังนั้นหากคุณต้องการเลขศูนย์นำหน้าคุณอาจต้องเติมตัวเลขนั้นในตัวคุณเอง
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 คุณแก้ปัญหาที่เชื่อถือได้สำหรับสีที่มีช่องอัลฟ่าหรือไม่?
Saket

2
@Saket คำตอบยอดนิยมควรจะ:String.format("#%08X", intColor)
TWiStErRob

@TWiStErRob อ่าเพิ่งเห็นความคิดเห็นของคุณภายใต้คำตอบยอดนิยม ขอบคุณ!
Saket

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 ของฉันซึ่งไม่จำเป็นต้องมีทั้งคลาสที่เฉพาะเจาะจงและไม่ใช้จาวา ดังนั้นคุณสามารถใช้มันในโครงการหลายแพลตฟอร์มได้เช่นกัน:

    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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.