Android getColor不一致

时间:2016-07-22 16:17:04

标签: android colors hex

我需要向后端服务器发送颜色代码(转发给iOS客户端),但String barcode = ""; @Override public boolean dispatchKeyEvent(KeyEvent e) { char pressedKey = (char) e.getUnicodeChar(); barcode += pressedKey; if (e.getKeyCode() == KeyEvent.KEYCODE_ENTER) { Toast.makeText(getApplicationContext(), "barcode--->>>" + barcode, Toast.LENGTH_LONG) .show(); } return super.dispatchKeyEvent(e); } 返回其他客户端(iOS)无法识别的负值。

这是资源HEX值:

ContextCompact.getColor(context, colorResourceId);

下面的代码给出了以下负整数值:<color name="green">#1FAB06</color>

-14701818

以十六进制转换的负值为:

int color = ContextCompat.getColor(context, mResourceColor);

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

2075398

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

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

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

1 个答案:

答案 0 :(得分: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

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

  ALPHA      RED      GREEN      BLUE
--------- --------- --------- ---------
1111 1111 0001 1111 1010 1011 0000 0110
  F    F    1    F    A    B    0    1

请注意,第32个最高有效位为1.因此,应在已签名的系统/变量中将此数字读取为负值。

这就是为什么你从getColor()获得一个负数

但是,

2075398是以下二进制数:

  ALPHA      RED      GREEN      BLUE
--------- --------- --------- ---------
0000 0000 0001 1111 1010 1011 0000 0110
  0    0    1    F    A    B    0    1

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

<强>机器人

对于Android,setTextColor()getColor()期望格式为0xAARRGGBB的十六进制值。所以,在获取/设置颜色时必须牢记这一点...... < / p>

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

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

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

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

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

<强> IOS

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