我试图理解一些从原始颜色值创建不透明度值的代码。
long fillColorValue = fillColor != null ? Long.parseLong(fillColor) : 0;
//Set opacity based on alpha
long alpha = fillColorValue >> 24;
float opacity = (alpha > 0 ? alpha / 255.0f : 1.0f);
shape.setFillOpacity(opacity);
long alpha = fillColorValue >> 24;
float opacity =(alpha> 0?alpha / 255.0f:1.0f);
如果我可以清楚地了解这种定义不透明度的方法,那会很棒 - 这里究竟发生了什么?
形状填充颜色最初由字符串值-1751607581表示。
如果颜色以32位表示,就像你的例子似乎,它看起来像是用alpha通道和三个颜色通道编码,每个通道都是8位(最有可能是ARGB)。
因此,移动>> 24
可以消除RGB分量,并将alpha通道保持在低位。
但要注意签名算术!如果原始字符串是负数,则fillColorValue
将为负数,并且在算术>>
移位后保持为负数...
随着alpha > 0
的守卫,结果是所有负的或零的α值将被视为不透明。
这意味着在128和255之间将没有alpha
值,因此在开放区间中没有opacity
值] 0.5,1.0 [。
这听起来很奇怪。也许那是真正的意图......或者也许颜色应该在打印成字符串时被解释为无符号?
或者也许在alpha通道中有9位,但那时它将是一种非常不寻常的格式,并且我没有看到浪费一半可能的值来编码单个不透明度值...这没有多大意义。