【问题标题】:java integer color to flutter color and backjava整数颜色颤动颜色并返回
【发布时间】:2020-02-20 03:28:00
【问题描述】:

我正在将我的应用程序从 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 整数颜色转换为颤振颜色并返回?

以 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;

【问题讨论】:

  • 按位 orand 和班次仍然存在 - api.flutter.dev/flutter/dart-core/int-class.html#operators
  • 你有例子吗? print('${2 | 1}') 向我展示了 3,正如预期的那样
  • @cricket_007查看我的编辑
  • Dart 使用 64 位整数,因此如果您将 Java 代码更改为使用 long 而不是 int,您将得到相同(正)的结果。您在 Java 中得到一个负数,因为您将一个 32 位 int 与最高位设置到一个 int 中,这些 int 是用 Java 签名的。当然,它们都是相同的位模式,只是根据容器是否签名而打印不同。
  • 这不是一个选项。这需要我的所有用户重新输入他们的数据。

标签: java flutter


【解决方案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 代码的原始样式,并将返回正确的值。

【讨论】:

  • 将java int颜色转换为dart材质颜色怎么样?
【解决方案2】:

Java 使用带符号的 32 位 int,因此值介于 -2^31 和 2^31 之间。一旦达到 2^31,它们就会从 -1 继续到 -2^31。

尝试将这个应用到你在 Flutter 中得到的结果上:

if (result > pow(2, 31)) {
  result = result - pow(2, 32);
}

【讨论】:

    【解决方案3】:

    也许用一个填充高位数字?

        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

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 2017-04-29
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多