Android getColor不一致

Zba*_*ian 3 android hex colors

我需要将颜色代码发送到后端服务器(转发到iOS客户端),但ContextCompact.getColor(context, colorResourceId);返回负值,这是其他客户端(iOS)无法识别的.

这是资源HEX值:

<color name="green">#1FAB06</color>
Run Code Online (Sandbox Code Playgroud)

下面的代码给出了以下负整数值: -14701818

int color = ContextCompat.getColor(context, mResourceColor);
Run Code Online (Sandbox Code Playgroud)

这个以十六进制转换的负值是:

1FAB06
Run Code Online (Sandbox Code Playgroud)

如果我将此十六进制值转换为十进制,我得到: 2075398

public int getColorDecimal(Context context) {
   int color = ContextCompat.getColor(context, mResourceColor);
   String hexColor = String.format("%06X", (0xFFFFFF & color));
   color = Integer.parseInt(hexColor, 16);

   return color;
}
Run Code Online (Sandbox Code Playgroud)

如果我将此正十进制应用于视图,则会出现此问题.Android无法识别此值.编辑文本保持白色.

mETName.setTextColor(getColorDecimal(context));
Run Code Online (Sandbox Code Playgroud)

由于数据同步,客户端和Web服务应该具有相同的值(不知何故).

W0r*_*0le 5

根据DOCS,此方法不返回无符号十进制int ...但是十六进制值:

int getColor(Context context,int id)
以0xAARRGGBB格式返回单个颜色值.

收到的号码是Alpha/Red/Green/Blue格式.

由于您的颜色是完全不透明的,因此会getColor()自动返回FF颜色的alpha值.所以,实际上,你的颜色是:FF1FAB06

他们都是一样的

所有数字都表示相同的二进制数.

FF1FAB06 是以下二进制数的十六进制表示:

  ALPHA      RED      GREEN      BLUE
--------- --------- --------- ---------
1111 1111 0001 1111 1010 1011 0000 0110
  F    F    1    F    A    B    0    1
Run Code Online (Sandbox Code Playgroud)

-14701818 是以下二进制数的带符号十进制表示:

  ALPHA      RED      GREEN      BLUE
--------- --------- --------- ---------
1111 1111 0001 1111 1010 1011 0000 0110
  F    F    1    F    A    B    0    1
Run Code Online (Sandbox Code Playgroud)

请注意,第32个最高有效位为1.因此,此数字应在有符号系统/变量中读取为负值.

这就是你得到负数的原因 getColor()

2075398但是,是以下二进制数:

  ALPHA      RED      GREEN      BLUE
--------- --------- --------- ---------
0000 0000 0001 1111 1010 1011 0000 0110
  0    0    1    F    A    B    0    1
Run Code Online (Sandbox Code Playgroud)

所以,第一个字节是00000000.因此,Alpha是00,换句话说,2075398是一种完全透明的颜色

ANDROID

在Android的情况下,setTextColor()getColor()期望格式的十六进制值0xAARRGGBB..因此,你必须在获取/设置颜色时记住这一点...

他们也期待Alpha属性(而不仅仅是红色/绿色/蓝色).所以,对于完全不透明的颜色,你有0xFF******

以FF开头的十六进制值实际上是signed int表示的负十进制值...

事实上,一切都只是内存中二进制数的表示

这样,在Android中,如果要设置颜色,则必须保留负值,因为-14701818是FF1FAB06十六进制的十进制表示(当使用signed int时就是这种情况).

如果由于某种原因需要将十进制正值发送到服务器,请仅为您的服务器使用该正值并保持Android Color分开.否则,每次要使用它们时,都必须继续将其转换为适当的系统(Android/iOS).

IOS

我不确定IOS如何处理颜色..但可能,你必须将值转换为IOS可以处理的格式.