【发布时间】:2019-08-16 09:07:20
【问题描述】:
我试图理解一些从原始颜色值创建不透明度值的代码。
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);
- 首先将 String 颜色值解析为 long。
- 然后,该值的位通过右移移动了 24 位 - 为什么?
long alpha = fillColorValue >> 24;
- 然后使用 long 创建一个看似代表不透明度值的浮点数。
浮动不透明度 = (alpha > 0 ? alpha / 255.0f : 1.0f);
如果我能对这种定义不透明度的方法有一些清晰的了解,那就太好了 - 这里实际发生了什么?
形状填充颜色最初由一个字符串值 -1751607581 表示。
【问题讨论】:
-
您似乎很好地处理了位移,这似乎是一个更困难的概念。你是不熟悉三元运算符(` x ? p : q `),还是问为什么要特别对待零)
-
或者您可能会问为什么使用 64 位
long,将 24 位移出并显然使用剩余的 40 位? -
你知道用的是什么颜色格式吗?可以假设,前 24 位是 RGB(每通道 8 位),其余 40 位是 alpha 通道,但在这种情况下,后续操作看起来很奇怪。
-
为了从 fillColorValue 中检索整数 Alpha 通道值,您需要将位右移 24。不太确定为什么在 int 足够的情况下将 fillColorValue 和 alpha 变量声明为 long。在您提供的代码中,三元组用于处理 Alpha 值可能为 0 的可能性。奇怪的是,因为 Alpha 值 0 通常意味着 完全透明,但在这种情况下,三元组正在强制执行任何小于 1 的值都会将不透明度设置为完全不透明 (1.0f)。在许多不同的情况下,这当然有充分的理由。
-
不太熟悉 alpha 和 int/long 到浮点转换的方法对我来说没有多大意义,代码背后的意图也不清楚。正如@DevilsHnd 指出的那样,三元很奇怪,实际上这就是问题所在……透明度显示为完全白色。
标签: java floating-point opacity long-integer