Android Paint setColor无法解析十六进制颜色值为int类型问题
报错原因
你所有调用失败的核心问题出在Integer.parseInt()的使用逻辑上,具体问题点如下:
Integer.parseInt()默认按十进制规则解析字符串,既不识别#开头的颜色格式,也不识别0x前缀的十六进制标识,直接传入这类字符串会直接判定为非法数字格式。- 即使给
Integer.parseInt()传入第二个参数16指定按十六进制解析,它的解析范围是32位有符号int的正区间,最大值为0x7FFFFFFF。带透明度的8位十六进制颜色是32位ARGB格式,当透明度值大于等于0x80时,数值最高位为1,会超出Integer.parseInt()的正整数解析上限,直接抛出NumberFormatException。 - 你直接传入
0xFFFFA500这类字面量能正常运行,是因为Java编译器在编译阶段就会把这类十六进制字面量直接转换为对应的32位int值,不需要走运行时的字符串解析流程,自然不会触发parseInt的解析报错。
正确实现方案
优先使用Android SDK自带的颜色解析工具,不需要自行处理字符串兼容、数值越界问题,原生支持#RRGGBB(6位无透明度)和#AARRGGBB(8位带透明度)两种格式:
String hexColor = "#0000ff"; String longerColor = "#0000ffff"; // 直接调用Color类的parseColor方法即可 paintObject.setColor(android.graphics.Color.parseColor(hexColor)); paintObject.setColor(android.graphics.Color.parseColor(longerColor));
如果需要自行实现解析逻辑(比如适配自定义颜色格式),注意用Long.parseLong()做中转避免数值越界,不要给解析字符串拼接0x前缀,同时给6位颜色默认补全全不透明的透明度通道:
private int parseHexColor(String colorStr) { // 移除开头的#号 String hexVal = colorStr.startsWith("#") ? colorStr.substring(1) : colorStr; long colorLong; if (hexVal.length() == 6) { // 6位格式默认透明度为FF(完全不透明) colorLong = 0xFF000000 | Long.parseLong(hexVal, 16); } else if (hexVal.length() == 8) { // 8位ARGB格式直接解析 colorLong = Long.parseLong(hexVal, 16); } else { throw new IllegalArgumentException("仅支持6位或8位十六进制颜色值"); } return (int) colorLong; }
注意:Long.parseLong()同样不识别0x前缀,解析前不要给十六进制字符串加这类前缀,否则会触发解析报错。
内容的提问来源于stack exchange,提问作者user18837670
相关产品推荐
相关产品推荐

