Android getColor不一致

Posted

技术标签:

【中文标题】Android getColor不一致【英文标题】:Android getColor inconsistency 【发布时间】:2016-11-26 15:13:57 【问题描述】:

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

这是资源十六进制值:

<color name="green">#1FAB06</color>

下面的这段代码给了我以下负整数值:-14701818

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

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

1FAB06

如果我将此十六进制值转换为十进制,我会得到: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;

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

mETName.setTextColor(getColorDecimal(context));

由于数据同步,客户端和 Web 服务应该(以某种方式)具有相同的值。

【问题讨论】:

为什么不将十六进制转换为 rgb 值呢? 【参考方案1】:

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

int getColor(上下文上下文,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.. 的十六进制值。因此,在获取/设置颜色时必须牢记这一点...

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

以 FF 开头的十六进制值实际上是有符号整数表示的负十进制值...

其实一切都只是一个二进制数在内存中的表示

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

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

IOS

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

【讨论】:

以上是关于Android getColor不一致的主要内容,如果未能解决你的问题,请参考以下文章

Android依赖库版本不一致的解决办法

Android - LocationManager requestLocationUpdates - 位置更新不一致

位置状态不一致 Android Studio

如何判断 Android 应用的 Apk 签名是不是一致?

android textview高度与字号高度不一致

Android DatePickerDialog样式不一致的问题