如何在 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 中。所有非有效数字都将从调用中删除,因此如果您想要前导零,您可能必须自己预先设置。 不适用于0x000000FF
或 0xFF0000FF
,如果您删除了 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 中将颜色整数转换为十六进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章