jjzjj

Android getColor 不一致

coder 2023-12-27 原文

我需要向后端服务器发送一个颜色代码(转发给 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;
}

如果我将这个正小数应用于 View ,就会出现问题。 Android 不识别此值。编辑文本保持白色。

mETName.setTextColor(getColorDecimal(context));

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

最佳答案

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

int getColor (Context context, int id)
Returns a single color value in the form 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 开头的十六进制值实际上是带符号 int 表示的负十进制值...

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

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

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

iOS

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

关于Android getColor 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531143/

有关Android getColor 不一致的更多相关文章

  1. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  2. ruby - Mongoid 3 中 Rails 模型的强一致性 - 2

    我希望特定模型的所有数据库交互都通过集群中的mongo主节点,因此我将模型设置为使用强一致性。classPhotoincludeMongoid::Documentwithconsistency::strongfield:number,type:Integer#let'ssayaphotonumberisuniqueinthedbvalidate:unique_numberend但这似乎不起作用,因为当我保存两张非常靠近的照片时,我仍然遇到验证错误。photo1#dbhasnumber=1forthisobjectphoto1.update_attributes(number:2)pho

  3. ruby - 为什么 Gemfile 语义版本控制运算符 (~>) 会产生与一个数字不一致的结果? - 2

    gemspec语义版本控制运算符~>(又名twiddle-wakka,又名pessimistic运算符)允许限制gem版本但允许进行一些升级。我经常看到它可以读作:"~>3.1"=>"Anyversion3.x,butatleast3.1""~>3.1.1"=>"Anyversion3.1.x,butatleast3.1.1"但是有了一个数字,这条规则就失效了:"~>3"=>"Anyversionx,butatleast3"*NOTTRUE!*"~>3"=>"Anyversion3.x"*True.Butwhy?*如果我想要“任何版本3.x”,我可以只使用“~>3.0”,这是一致的。就

  4. ruby - Ruby 中不一致的隐式哈希创建? - 2

    好的,所以我将我自己的DSL中的一些东西与Ruby进行了比较。他们都支持的一个结构是这个x=["key"=>"value"]知道数组和散列的区别,我会认为这是不合法的,但是在Ruby中的结果是[{"key"=>"value"}]这是为什么?有了这种语法,你为什么不能这样做x=("key"=>"value")为什么数组是隐式创建的哈希的特例? 最佳答案 另一个特殊情况是在函数调用中,考虑:deff(x)puts"OK:#{x.inspect}"endf("foo"=>"bar")=>OK:{"foo"=>"bar"}因此在某些情况下,

  5. ruby - 00.0 和 0.0 不一样吗? - 2

    我刚刚在编程语言ruby中发现了一个奇怪的问题,这不是什么大问题,但我就是不明白为什么会这样。如果有人知道我的问题的问题,我会很感兴趣。在ruby中你可以写成0或者00,没关系,结果是一样的。如果您运行0===00,您还会得到true,这意味着两个输入完全相同。0.0也等于0,所以逻辑上00.0也应该等于0.0但问题是,如果你尝试使用数字00.0那么你只会得到一个错误。例如,如果您运行:a=00.0你得到这个错误:syntaxerror,unexpectedtINTEGER当然我知道这是个小问题,但如前所述,我想了解为什么计算机不将00.0视为与0.0相同?

  6. ruby - if + else 和 if -> unless 不一致 - 2

    我今天在定义我解决的自定义RSpec匹配器时遇到了一个问题,但实际上看不出任何一种方法有效而另一种方法无效的原因,这是代码:方法1——if+else:RSpec::Matchers.define:have_success_messagedo|message|matchdo|page|ifmessage.nil?page.shouldhave_selector('div.alert.alert-success')elsepage.shouldhave_selector('div.alert.alert-success',text:message)endendend方法2--if后跟unl

  7. ruby-on-rails - 如何使用 Rails Faker gem 生成一致的数据? - 2

    为了用虚假数据填充我的Rails应用程序,我经常这样做:person=Person.create(:first_name=>Faker::Name.first_name,:last_name=>Faker::Name.last_name,:email=>Faker::Internet.email)这可能会产生一个像这样的人:Firstname:OliviaLastname:KuberaEmail:milan_nieklauson@bachmannjacob.net有没有办法生成更连贯的假数据,例如:Firstname:OliviaLastname:KuberaEmail:olivia_

  8. ruby - 在 String 子类上覆盖 =~ 方法会产生不一致 - 2

    我为String的子类覆盖了=~方法:classMyString重写的方法在某些情况下被正确调用:r=/abc/s=~r#=>"Overriddenmethod."s.send(:=~,r)#=>"Overriddenmethod."s.send(:=~,/abc/)#=>"Overriddenmethod."而在其他情况下它被绕过,而是调用String#=~:s=~/abc/#=>0s=~(/abc/)#=>0我可以在Ruby1.8.7、2.1.0上重现这些结果。有人知道为什么会这样吗?是错误吗? 最佳答案 在String#=~的

  9. php - Ruby 和 PHP HMAC 不一致 - 2

    我尝试在Ruby中创建一个HMAC,然后在PHP中验证它。ruby:require'openssl'message="A522EBF2-5083-484D-99D9-AA97CE49FC6C,1234567890,/api/comic/aWh62,GET"key="3D2143BD-6F86-449F-992C-65ADC97B968B"hash=OpenSSL::HMAC.hexdigest('sha256',message,key)phashPHP:对于Ruby,我得到:20e3f261b762e8371decdf6f42a5892b530254e666508e885c708c5b

  10. ruby - YARD 和 RDoc 不一样? - 2

    如果我错了请纠正我,是YARD与RDoc不同?它不是基于RDoc,而是完全重写?所以如果我使用YARD,我就不必为RDoc而烦恼,对吧? 最佳答案 简而言之:是的。(针对所有三个问题。)请注意,YARD在很大程度上与RDoc向后兼容,至少就标记而言是这样。(RDoc插件OTOH不适用于YARD。)因此,您实际上可以使用YARD来处理遗留RDoc文件。YARD主要是RDoc的适当超集。 关于ruby-YARD和RDoc不一样?,我们在StackOverflow上找到一个类似的问题:

随机推荐