问题描述
我们都知道 setBackgroundColor() 方法用于动态设置 view 的背景颜色。今天在做需求的时候,需要根据情况动态更新自定义 view 的背景颜色,于是就想当然的这么写:
mItemView.setBackgroundColor(R.color.message_red)
结果呈现出来的 UI 效果并不是我们想要的。纳闷了好久。。。。
然而,如果自己定义一个 color.xml 文件,然后在 xml 中引用此文件中的颜色,却是一切顺利。
原因:
颜色4个字节从高到低对应 不透明度 红 绿 蓝 四个分量,0xFFFFFF 对应不透明度的分量是0,所以后面不管是什么背景都是透明的。0xFFFFFFFF 就是白色了,0x80FFFFFF 就是半透明的白色。
1、Color.rgb() 会自动把不透明读设成255,
2、解析字符串颜色 “#FFFFFF” 也能判断出只给出了三个分量会自动把不透明度设成255。
3、而对于整数0xFFFFFF和0x00FFFFFF是一样的,是完全透明的。
解决办法
1、可以参考, HEX与RGB互相转换
setBackgroundColor(Color.rgb(255, 0, 0));
2、利用系统的 parseColor 设置(HEX 形式/16进制形式)
setBackgroundColor(Color.parseColor(“#6495ED”));
3、通过 resources 或者 ContextCompat(推荐)
setBackgroundColor(getResources().getColor(R.color.cornflowerblue));
setBackgroundColor(ContextCompat.getColor(this, R.color.message_red)); // 更推荐后者