我有一个这样的代码: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个赞
这段代码可能存在三个问题:
正如@shiftpsh 所指出的:
Integer.parseInt
不理解0x
前缀。有两种方法可以解决这个问题:使用
Integer.decode
宁可Integer.parseInt
。不要
0x
在格式中包含前缀。第二个潜在问题是这
%02x
意味着十六进制,用最少两位数字填充零。但是,如果任何的r
,green
或者blue
是足够大的,所产生的颜色值将大于255,你会得到超过2个十六进制数字。当字符串被解码时,这将导致不正确的 RGB 值。我很惊讶它
%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 库方法。)
添加回答
举报
0/150
提交
取消