背景
在平时做页面开发的时候,经常会遇到UI设计图画了一行文字,然后给了一个色值类似 #565D66,然后给了一个透明度80%。然后你看到会说:好烦,不能给一个能直接使用的色值吗?然后开始了和UI老师的深度交流去了。
一般实现
然后你经过百度,找到了一张16进制色值对照表,默默添加了两位透明度,然后又遇到一个TextView,然后又搜了一下表,默默修改了色值......心情不是很美丽了
放大招
首先说明一下Android里面色值代表的含义
Android中的颜色值通常遵循RGB/ARGB标准,使用时通常以#字符开头,以16进制表示。 其中RGB依次代表红色(Red)、绿色(Green)、蓝色(Blue). ARGB依次代表透明度(Alpha)、红色(Red)、绿色(Green)、蓝色(Blue)
eg:#FF00CC99其中FF是透明度,00是红色值,CC是绿色值,99是蓝色值
上代码:
object AlphaConvertUtil {
/**
* 颜色和透明度的转换
*/
fun colorAlphaConvert(alpha: Float, color: Int): Int {
// 根据百分比计算出透明度值
val alphaInt: Int = (alpha * 0xff).toInt()
// 转换为16进制透明度
val alphaFinal = alphaInt shl 24 or 0x00ffffff
return color and alphaFinal
}
/**
* 颜色和透明度的转换
*/
fun colorAlphaConvert(alpha: Float, textView: TextView) {
// 根据百分比计算出透明度值
val alphaInt: Int = (alpha * 0xff).toInt()
// 转换为16进制透明度
val alphaFinal = alphaInt shl 24 or 0x00ffffff
val color = textView.currentTextColor
textView.setTextColor(color and alphaFinal)
}
}
原理讲解
我们通过代码进行转换
- 首先通过textView.currentTextColor拿到view直接设置的色值
- 前两位表示透明度,按照百分比计算出实际的透明度值 比如80%的透明度 0.8 * 0xff = 0xcc
- 进行移位运算 0xcc左移24位得到0xcc000000,然后与0x00ffffff进行或运算,得到0xccffffff
- 最后将上一步的结果与真正的色值进行与运算,修改前两位,得到最终的色值,然后设置一下就好了
核心思想
拿到当前色值,手动转换前两位透明度,然后在设置进去。中间了为了提高转换效率进行一些位运算