说我的AS代码中有以下设置:
var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100
我如何将它们组合成#RRGGBBAA
十六进制颜色?我一直在谷歌搜索并试图找出十六进制转换和符号没有运气。
答案 0 :(得分:8)
有两种方法可以做到这一点。 一个是有点hacky使用int的toString()方法并传递16作为基数/基数:
var rgb:int = (int)("#0000FF".replace("#","0x"));//convert the string to a int (note you can type hex ints starting with 0x (e.g. 0x0000FF)
var a:int = 42;
var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));
或使用bitwise operators的 请注意,在上面的跟踪中使用 另请注意,有时您可能希望在as3中使用ARGB,例如在使用BitmapData时: <强>更新强> 上面的bitshift代码片段实际上详细解释了rgb提取,这有助于更好地理解事物,但是你已经有了rgb,所以这是添加alpha组件的问题。你也提到了42%,它与0到255的刻度不同。因此,吼叫是你的答案: 关于速度,如果我运行两种不同的转换方法,这里有一百万次执行时间: 正如你所能,bitwise版本更快,对于你的情况甚至比字符串版本更简洁。此外,既然您了解按位运算符,则可能更容易阅读/理解。 总结: 此外,您提到Google很有趣,因为您可以使用搜索convert to hex。 <强>更新强>:
似乎有点混乱所以我将3个步骤分成了几个功能: 这将是: 或一气呵成:var rgb:uint = (uint)("#0000FF".replace("#","0x"));
//extract components using bit shifting (>>) and masking (0xFF)
var r:uint = rgb >> 16 & 0xFF;
var g:uint = rgb >> 8 & 0xFF;
var b:uint = rgb >> 0 & 0xFF;//same as rgb >> 0xFF, just added >> 0 to make the shift obvious
var a:uint = 42;
var rgba:uint = r << 24 | g << 16 | b << 8 | a;
var argb:uint = a << 24 | r << 16 | g << 8 | b;
//test
trace(rgba.toString(16));
trace(argb.toString(16));
toString(16)
是为了让它对我们人类有用,
在使用十六进制颜色值时,您将使用实际的uint值。addChild(new BitmapData(100,100,true,0x2a0000ff));//add a 42% transparent blue box (100x100 px)
var rgb:uint = (uint)("#0000FF".replace("#","0x"));
var a:uint = (uint)((42 * .01) * 255);//map 42 from 0<>100 to 0<>255 ( *.01 is the same as / 100 but faster
var rgba:uint = rgb << 8 | a;
var argb:uint = a << 24 | rgb;
using strings (var rgba:int = int("0x"+rgb.toString(16) + a.toString(16));) takes 851 ms
using bitwise ops (var rgba:uint = rgb << 8| a;) takes 3 ms
var color:String = "#0000FF"; //blue
var alpha:Number = 42; //42% or 42/100
var rgb:uint = (uint)(color.replace("#","0x"));
var a:uint = (uint)((alpha * .01) * 255);
var rgba:uint = rgb << 8 | a;
trace("hex: #",rgba.toString(16),"test",0x0000ff6b.toString(16));
function getHex(hexStr:String):uint{
return (uint)(hexStr.replace("#","0x"));
}
function getHexAlpha(alpha:uint):uint{
return (uint)((alpha * .01) * 255);
}
function rgbaConcat(rgb:uint,a:uint):uint{
return rgb << 8 | a;
}
trace("test",rgbaConcat(getHex("#FF9900"),getHexAlpha(50)).toString(16));
function rgbaConcat(hexStr:String,alpha:uint):uint{
var rgb:uint = (uint)(hexStr.replace("#","0x"));
var a:uint = (uint)((alpha * .01) * 255);
return (rgb << 8 | a);
}
trace("test",rgbaConcat("#123456",100).toString(16));
答案 1 :(得分:2)
我不确定动作脚本中是否有sprintf或类似内容,但你会使用类似的东西:
var alpha_2:int = Math.round(255*alpha/100);
var rgba:String = sprintf("%s%2x", color, alpha_2);
顺便提一下,一定要检查一下是#RRGGBBAA
还是#AARRGGBB
显然sprintf不可用,你可以使用Is there something like printf in Action Script 3?中提到的替代品
如果您不喜欢使用类似printf的功能,可以使用:
function hex_char(value:int) {
if (value < 0)
return "X";
if (value < 10)
return String.fromCharCode("0".charCodeAt(0)+value);
if (value < 16)
return String.fromCharCode("A".charCodeAt(0)+value-10);
return "X";
}
var alpha_2:int = Math.round(255*alpha/100);
var rgba:String = color + hex_char(alpha_2/16) + hex_char(alpha_2%16);
或者您可以使用hex_char
的以下定义(我假设)会针对0
或15
下的任何值而不是{{1}为您提供异常/错误}
"X"