You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:54:29