为了账号安全,请及时绑定邮箱和手机立即绑定

不用java解析字符串颜色

不用java解析字符串颜色

慕尼黑5688855 2021-06-15 15:09:54
我有一个这样的代码:String hex = String.format("0x%02x%02x%02x", r * 0.5, green * 0.6, blue * 0.7));0.5 和 0.6 和 0.7 是变量,我想从变量十六进制设置视图的背景颜色:v.setBackgroundColor(Integer.parseInt(hex, 16));当我尝试将其转换为十六进制整数时,它会抛出异常,例如java.lang.NumberFormatException我怎样才能做到这一点?
查看完整描述

2 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

这段代码可能存在三个问题:

  1. 正如@shiftpsh 所指出的:Integer.parseInt不理解0x前缀。有两种方法可以解决这个问题:

    • 使用Integer.decode宁可Integer.parseInt

    • 不要0x在格式中包含前缀。

  2. 第二个潜在问题是这%02x意味着十六进制,用最少两位数字填充零。但是,如果任何的rgreen或者blue是足够大的,所产生的颜色值将大于255,你会得到超过2个十六进制数字。当字符串被解码时,这将导致不正确的 RGB 值。

  3. 我很惊讶它%02x适用于像r * 0.5. 后者是 adouble并且根据我对 javadoc阅读,x转换不适用。


但是,如果此代码的唯一目的是从r,green和 中创建 RGB 值blue,则有一种明显更有效的方法。

 int r0 = ((int)(r * 0.5)) & 0xff;

 int g0 = ((int)(green * 0.6)) & 0xff;

 int b0 = ((int)(blue * 0.7)) & 0xff;

 v.setBackgroundColor((r0 << 16) | (g0 << 8) | b0);

或者,使用android.graphics.Color.argbRGB 转换应该同样有效......尽管这是一个 Android API 而不是 Java API。(我找不到同样高效的直接等效的 Java SE 库方法。)


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信