我正在将我的应用程序从Java重建为抖动。我正在使用Firebase将颜色存储为整数值。在Java中,我可以使用以下命令将rgb值转换为整数值:
colorInt = (255 << 24) | (color.red << 16) | (color.green << 8) | color.blue;
我可以使用以下内容将整数值转换为rgb:
int r = (colorInt >> 16) & 0xFF;
int g = (colorInt >> 8) & 0xFF;
int b = colorInt & 0xFF;
如何将Java integercolor转换为颤动颜色并返回?
例如,以RGB 154、255、147
在扑朔迷离中,这将是4288348051
(255 << 24) | (154 << 16) | (255 << 8) | 147;
(4278190080) | (10092544) | (65280) | 147;
(4278190080) | (10092544) = 4288282624;
(4278190080) | (10092544) | (65280) = 4288347904;
(4278190080) | (10092544) | (65280) | 147 = 4288348051
在Java中,这将是-6619245
(255 << 24) | (154 << 16) | (255 << 8) | 147;
(-16777216) | (10092544) | (65280) | 147;
(-16777216) | (10092544) = -6684672;
(-16777216) | (10092544) | (65280) = -6619392;
(-16777216) | (10092544) | (65280) | 147 = -6619245;
答案 0 :(得分:1)
Java使用的是带符号的32位int,因此值在-2 ^ 31和2 ^ 31之间。一旦达到2 ^ 31,它们将从-1继续朝向--2 ^ 31。
尝试将此方法应用于您在Flutter中获得的结果:
if (result > pow(2, 31)) {
result = result - pow(2, 32);
}
答案 1 :(得分:1)
因此,正如@Ovidiu提到的,Java使用带符号的32位整数。扩展他们发布的代码块,我们可以创建一个完整的示例,该示例提供我们所需的内容:
import 'dart:math';
int chopToJavaInt (int result) {
while (result > pow(2, 31)) {
result = result - pow(2, 32);
}
return result;
}
int javaIntColor(int r, int g, int b) {
var x = (g << 24) | (r << 16) | (g << 8) | b;
return chopToJavaInt(x);
}
void main () {
print(javaIntColor(154, 255, 147)); //-6619245
}
此解决方案是模块化的,可以通过Java代码保留您的原始样式,并将返回正确的值。
答案 2 :(得分:0)
也许用一位填充高位数字?
int rgb = -6619245;
final c = Color(rgb);
print('${c.red} ${c.green} ${c.blue}');
int fromColorRgb = c.value | 0xFFFFFFFF00000000;
print('$rgb : $fromColorRgb');
结果:
I/flutter (10689): 154 255 147
I/flutter (10689): -6619245 : -6619245
假设您的Alpha通道始终为255