如何在Android中将颜色整数转换为十六进制字符串?


194

我有一个从生成的整数 android.graphics.Color

整数的值为-16776961

如何将此值转换为格式为#RRGGBB的十六进制字符串

简而言之:我想从-16776961输出#0000FF

注意:我不希望输出包含Alpha,并且我也尝试了此示例,但未成功


您在尝试设置十六进制颜色是什么?我认为这里有一个不同的答案
Blundell,

@Blundell我将颜色导出到外部应用程序。颜色必须采用这种格式
#RRGGBB

那么 developer.android.com/reference/android/content/res/…怎么了?您必须粘贴url或滚动到getColor(int)
Blundell

我正在获取原始整数。这些值不是来自资源流控件
Bosah Chude 2011年

Answers:


470

该掩码可确保您仅获得RRGGBB,%06X为您提供零填充的十六进制(始终为6个字符):

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

3
效果很好,谢谢!比尝试在Integer.toHexString()上使用子字符串更容易,更准确。
汤姆(Tom)

7
我刚刚意识到有Color.parseColor(String hex)方法可以完全满足我的要求。
Marcel Bro 2013年

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

5
如果您的颜色使用Alpha,请不要使用此答案。你会失去它。
西蒙(Simon)

5
@Simon,要使其准备好使用alpha,只需删除蒙版并将6更改为8。请注意,OP要求取消alpha。
TWiStErRob

54

7
这个答案保留了颜色的Alpha
Bosah Chude 2011年

3
好吧,如果您想摆脱Alpha,只需为其创建一个位掩码:Integer.toHexString(value&0x00FFFFFF)
ming_codes 2011年

3
Java int类型为4个字节长。根据android.graphics.Color的文档,最左边的字节是alpha通道。通过使用值为0x00FFFFFF的按位AND运算,您实际上将最左边的字节(alpha通道)清除为0。与Integer.toHexString一起使用时,它将在String中保留其余3个字节。所有非有效数字都将从呼叫中删除,因此,如果您想要前导零,则可能必须自己添加。
ming_codes 2011年

1
不适用于0x000000FF,或者0xFF0000FF如果您删除了Alpha。
TWiStErRob

26

我相信我已经找到了答案,此代码将整数转换为十六进制字符串,并删除了alpha。

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

请注意,仅当您确定删除Alpha不会影响任何内容时,才使用此代码。


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”(无Alpha)。第二种变体不适用于0x00000FFF->“ F”(缺少位)。
TWiStErRob

@TWiStErRob您是否提供了一种可以可靠地处理带有Alpha通道的颜色的解决方案?
Saket

2
@Saket最佳答案的变体应该是:String.format("#%08X", intColor)
TWiStErRob '18

@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时,某些颜色可能会出现Unknown color异常。

使用此方法String.format(“#%06X”,(0xFFFFFF&intColor)),您将丢失alpha值。

所以我推荐这种方法:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.