colors.xml中必须使用#aarrggbb格式定义带透明度的颜色,如#80ff0000表示50%不透明的红色;不支持#rgba、rgba()或argb错位写法,主题色等系统属性还要求必须不透明。

colors.xml 里怎么写带透明度的色值
android 的 colors.xml 不支持直接写 #RGBA 或 #ARGB 这种四通道简写(比如 #80FF0000 是合法的,但很多人误以为 #80F00 也能用——它不能)。真正能用的只有 8 位十六进制格式:#AARRGGBB,其中前两位 AA 是 alpha 通道,决定透明度。
常见错误是把 CSS 风格的 rgba(255, 0, 0, 0.5) 或 Sketch 里复制的 #FF000080(错位!)直接粘过去,结果编译报错 Color value not valid 或运行时颜色全黑/全透明。
-
#FF表示不透明,#00表示完全透明;中间值按 16 进制线性映射:比如#80≈ 50% 透明(实际是 128/255 ≈ 50.2%) - 别手写换算,用编辑器自带的十六进制 alpha 查表更稳(下个副标题就列)
- 如果从设计稿拿到的是 RGB + opacity 数值(如 R=255, G=102, B=0, α=30%),先算 alpha 字节:
math.round(0.3 * 255)→77→4D,再拼成#4DFF6600
常用透明度 Hex 值速查表(#AA 部分)
别每次打开计算器。这些是设计师和开发高频使用的 alpha 值,对应标准透明度百分比(四舍五入到最接近的 16 进制字节):
- 100% 不透明 →
#FF - 90% →
#E6 - 80% →
#CC - 70% →
#B3 - 60% →
#99 - 50% →
#80 - 40% →
#66 - 30% →
#4D - 20% →
#33 - 10% →
#1A - 0% 完全透明 →
#00
举例:深灰文字半透效果,原色 #333333,加 70% 不透明 → #B3333333;注意不是 #333333B3(那是错的 ARGB 顺序)。
为什么 #AARRGGBB 在某些旧设备上显示异常
Android 4.1(API 16)之前,系统对 alpha 通道解析有兼容性问题,尤其在 TextView 的 textColor 或 Drawable 着色时,#80FF0000 可能被当纯黑或忽略 alpha。这不是你写错了,是底层 Skia 渲染引擎的老 bug。
- 最低兼容到 API 16 的项目,建议避免在
colorAccent、colorPrimary这类主题色里用带透明度的值(主题色必须是不透明的) - 真要动态控透明度,优先用
Color.argb()在代码里生成,而不是塞进colors.xml - 矢量图(
.xmldrawable)里引用@color/my_transparent_red是安全的,但确保该 color 定义在values/colors.xml而非values-v23/下
别在 colors.xml 里用 alpha 属性单独定义透明度
有人想“复用颜色+动态调透明”,于是写:
<color name="red">#FF0000</color><br><color name="red_50">@color/red</color>
再幻想系统自动叠加 alpha —— 不行。@color/red 引用只是文本替换,不会做 alpha 合成。
- Android 不支持类似 CSS 的
color: hsla(...)或变量计算 - 想复用,只能手动写多套:
red_100、red_80、red_50… 每个都是完整#AARRGGBB - 如果项目用了 Jetpack Compose,改用
Color(0xFF, 0x00, 0x00, 0x80)更灵活,但这是另一套体系,和colors.xml无关
最易被忽略的一点:主题中所有以 color 开头的属性(colorBackground、colorOnSurface 等)都要求不透明值,填了带 AA 的颜色,有些 Material 组件会直接 fallback 到默认色,且不报错。