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

Posted

技术标签:

【中文标题】如何在 Android 中将颜色整数转换为十六进制字符串?【英文标题】:How to convert a color integer to a hex String in Android? 【发布时间】:2011-09-26 06:16:31 【问题描述】:

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

整数的值为 -16776961

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

简单地说:我想从-16776961输出#0000FF

注意:我不希望输出包含 alpha,我也尝试过 this example 没有任何成功

【问题讨论】:

你想设置什么十六进制颜色?我认为这里有不同的答案 @Blundell 我正在将颜色导出到外部应用程序。颜色需要采用这种格式#RRGGBB 那么developer.android.com/reference/android/content/res/… 有什么问题?您必须粘贴 url 或滚动到 getColor(int) 我正在获取原始整数。这些值不是来自资源 ow 小部件 【参考方案1】:

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

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

【讨论】:

效果很好,谢谢!比尝试在 Integer.toHexString() 上使用子字符串更容易、更准确。 我刚刚意识到有 Color.parseColor(String hex) 方法可以完全满足我的要求。 int colorInt = 0xff000000 | Integer.parseInt(hexString, 16); 如果您的颜色使用 alpha,请不要使用此答案。你会失去它。 @Simon,要让这个 alpha 就绪,只需移除掩码并将 6 更改为 8。请注意,OP 要求关闭 alpha。【参考方案2】:

试试 Integer.toHexString()

来源: In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros?

【讨论】:

这个答案保留了颜色的alpha 好吧,如果你想摆脱 alpha,只需为其创建一个位掩码:Integer.toHexString(value & 0x00FFFFFF) Java int 类型为 4 个字节长。根据 android.graphics.Color 的文档,最左边的字节是 alpha 通道。通过使用值为 0x00FFFFFF 的按位与运算,您基本上将最左边的字节(alpha 通道)清除为 0。当与 Integer.toHexString 一起使用时,它只会将其余 3 个字节留在 String 中。所有非有效数字都将从调用中删除,因此如果您想要前导零,您可能必须自己预先设置。 不适用于 0x000000FF0xFF0000FF,如果您删除了 alpha。【参考方案3】:

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

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

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

【讨论】:

如果你通过这个发送0x00FFFFFF,它会崩溃Color.parseColor @TWiStErRob 在这种情况下使用Color.TRANSPARENT【参考方案4】:

这就是我所做的

 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 你有没有一个可靠地适用于带有 alpha 通道的颜色的解决方案? @Saket 最佳答案的变体应该是:String.format("#%08X", intColor) @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);

【讨论】:

【参考方案6】:

您可以将其用于不带 alpha 的颜色:

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

或者这个带有 alpha:

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

【讨论】:

【参考方案7】:

使用此方法Integer.toHexString,您可以在使用Color.parseColor时对某些颜色产生未知颜色异常。

而使用这种方法 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());
    

【讨论】:

【参考方案8】:

如果您使用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

【讨论】:

【参考方案9】:

修复颜色选择器库中的 alpha 问题。

如果您在选择颜色时得到一个整数值作为回报,请先将其转换为十六进制颜色。

    String hexVal = String.format("#%06X", (0xFFFFFFFF & 
    color)).toUpperCase();

    int length=hexVal.length();
    String withoutHash=hexVal.substring(1,length);


    while (withoutHash.length()<=7)
    

        withoutHash="0"+withoutHash;

    
    hexVal ="#"+withoutHash;

【讨论】:

【参考方案10】:
String int2string = Integer.toHexString(INTEGERColor); //to ARGB
String htmlColor = "#"+ int2string.substring(int2string.length() - 6, int2string.length()); // a stupid way to append your color

【讨论】:

【参考方案11】:

在 Koltin 中使用这种方式

var hexColor = "#$Integer.toHexString(ContextCompat.getColor(context, R.color.colorTest))"

【讨论】:

以上是关于如何在 Android 中将颜色整数转换为十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中将十六进制颜色代码解析为它们各自的整数值

在 JavaScript 中将整数转换为十六进制字符串

在 Python 中将十六进制颜色代码转换为颜色名称

如何在Javascript中将整数转换为具有固定长度的十六进制?

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

如何在 elixir 中将二进制转换为 base10(十进制)整数