鸿蒙应用开发实战【14】— 毛玻璃卡片:#AARRGGBB 颜色格式深度解析
·
鸿蒙应用开发实战【14】— 毛玻璃卡片:#AARRGGBB 颜色格式深度解析
前言
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
如果你从 Web/Android/iOS 转型 HarmonyOS 开发,有一个颜色格式的坑几乎所有人都会踩:ArkUI 的颜色格式是 #AARRGGBB(Alpha 在最前),而不是 CSS 的 #RRGGBBAA(Alpha 在最后)。号码助手在开发初期因为这个问题,让所有毛玻璃卡片显示成了淡黄色。本篇完整解析这个问题,并介绍 ArkUI 中颜色的所有表示方式。
本篇涵盖:#AARRGGBB vs #RRGGBBAA 对比、Alpha 值十六进制换算、RGBA/ARGB 颜色格式、ArkUI 颜色的5种表示方式、毛玻璃效果实现、颜色调试技巧、常见颜色问题排查。
一、问题现象复现
1.1 黄色卡片 Bug
// ❌ 错误写法(CSS 习惯,Alpha 在最后)
static readonly CARD: string = '#FFFFFFB8' // 设计意图:72% 不透明度白色
static readonly CARD_B: string = '#FFFFFFE6' // 设计意图:90% 不透明度白色
ArkUI 的解析结果:
| 输入值 | ArkUI 解析 | 显示颜色 |
|---|---|---|
#FFFFFFB8 |
AA=FF(100%), R=FF, G=FF, B=B8 | RGB(255, 255, 184) = 淡黄色! |
#FFFFFFE6 |
AA=FF(100%), R=FF, G=FF, B=E6 | RGB(255, 255, 230) = 浅黄色! |
图1:左图为 #RRGGBBAA 错误格式导致的黄色卡片;右图为修复后的半透明白色卡片
1.2 根本原因
CSS / Web / iOS:#RRGGBBAA(RGBA 顺序,Alpha 在最后)
Android XML: #AARRGGBB(ARGB 顺序,Alpha 在最前)
ArkUI: #AARRGGBB(同 Android,Alpha 在最前)
ArkUI 遵循 ARGB 顺序,而大多数 Web 开发者习惯的是 RGBA 顺序。
二、#AARRGGBB 格式详解
2.1 格式解析
#AARRGGBB
^^ AA = Alpha(透明度)0x00=完全透明,0xFF=完全不透明
^^ RR = Red(红色分量)0x00-0xFF
^^ GG = Green(绿色分量)0x00-0xFF
^^ BB = Blue(蓝色分量)0x00-0xFF
2.2 Alpha 值换算对照表
// 计算公式:十六进制 = Math.round(透明度 * 255).toString(16).toUpperCase()
// 例:72% → 0.72 * 255 ≈ 184 = 0xB8
| 不透明度 | 计算值 | 十六进制 | 典型用途 |
|---|---|---|---|
| 100% | 255 | FF | 完全不透明(实色) |
| 90% | 230 | E6 | CARD_B 高亮卡片 |
| 80% | 204 | CC | 中等半透明 |
| 72% | 184 | B8 | CARD 毛玻璃卡片 |
| 60% | 153 | 99 | 遮罩层 |
| 50% | 128 | 80 | TEXT_2 副文字 |
| 30% | 77 | 4D | TEXT_3 占位文字 |
| 28% | 71 | 47 | 状态徽标边框 |
| 20% | 51 | 33 | 浮层轻蒙版 |
| 13% | 33 | 21 | WARN_BG 警告背景 |
| 12% | 31 | 1F | PRIMARY_BG 主色背景 |
| 8% | 20 | 14 | LINE 分割线 |
| 6% | 15 | 0F | MUTED_BG 静默背景 |
| 0% | 0 | 00 | 完全透明(不可见) |
2.3 颜色转换示例
// CSS rgba(255, 255, 255, 0.72) → ArkUI #B8FFFFFF
// 步骤:
// 1. Alpha = 0.72 → Math.round(0.72 * 255) = 184 → 0xB8
// 2. 组合:#B8 + FF + FF + FF = #B8FFFFFF
// CSS rgba(79, 124, 255, 0.12) → ArkUI #1F4F7CFF
// 步骤:
// 1. Alpha = 0.12 → Math.round(0.12 * 255) = 31 → 0x1F
// 2. RGB = 79=0x4F, 124=0x7C, 255=0xFF
// 3. 组合:#1F + 4F + 7C + FF = #1F4F7CFF
三、ArkUI 颜色的 5 种表示方式
3.1 十六进制字符串(最常用)
// 格式1:#AARRGGBB(含透明度)
.backgroundColor('#B8FFFFFF') // 72% 透明白色
// 格式2:#RRGGBB(不含透明度,默认完全不透明)
.backgroundColor('#4F7CFF') // 蓝色(等价于 #FF4F7CFF)
// 格式3:#RGB(简写,每位扩展为两位)
.backgroundColor('#FFF') // 等价于 #FFFFFF
3.2 Color 枚举
// ArkUI 内置颜色枚举(不带透明度)
.backgroundColor(Color.White) // 白色
.backgroundColor(Color.Black) // 黑色
.backgroundColor(Color.Red) // 红色
.backgroundColor(Color.Transparent) // 完全透明(常用于去除背景)
3.3 rgb() 函数
// rgb(red, green, blue) — 0-255
.backgroundColor(rgb(79, 124, 255)) // 等价于 #4F7CFF
3.4 rgba() 函数
// rgba(red, green, blue, alpha) — alpha: 0.0-1.0
.backgroundColor(rgba(255, 255, 255, 0.72)) // 等价于 #B8FFFFFF
// ⚠️ 注意:ArkUI 的 rgba() 中 alpha 是 0.0-1.0 比例,不是 0-255
3.5 数字值(ResourceColor 类型)
// 0xAARRGGBB 十六进制数字
.backgroundColor(0xB8FFFFFF) // 与字符串 '#B8FFFFFF' 等价
四、号码助手中的颜色系统
4.1 完整颜色令牌表
// AppColors.ets — 修复后的完整颜色系统
export class AppColors {
// 背景色(页面主背景)
static readonly BG: string = '#F4F6FB' // 浅灰蓝页面背景
// 卡片背景(毛玻璃效果,关键:Alpha 在前)
static readonly CARD: string = '#B8FFFFFF' // 72% 透明白色
static readonly CARD_B: string = '#E6FFFFFF' // 90% 透明白色
// 分割线
static readonly LINE: string = '#14141E3C' // 8% 透明深色
// 文字色(纯色,无透明度)
static readonly TEXT: string = '#12162B' // 主文字(近黑)
static readonly TEXT_2: string = '#68708A' // 副文字(蓝灰)
static readonly TEXT_3: string = '#828BA1' // 三级文字(浅灰)
// 主色(不透明)
static readonly PRIMARY: string = '#4F7CFF' // 蓝色
// 主色浅背景(透明度)
static readonly PRIMARY_BG: string = '#1F4F7CFF' // 12% 透明蓝色
}
4.2 颜色效果预览
| 令牌名 | 十六进制值 | 可视化效果 |
|---|---|---|
| BG | #F4F6FB | 浅灰蓝页面底色 |
| CARD | #B8FFFFFF | 毛玻璃白卡片(72%透明) |
| CARD_B | #E6FFFFFF | 高亮白卡片(90%透明) |
| LINE | #14141E3C | 极淡深色边框(几乎透明) |
| PRIMARY_BG | #1F4F7CFF | 浅蓝色背景(12%透明) |
五、毛玻璃效果完整实现
5.1 毛玻璃卡片样式代码
// 典型毛玻璃卡片
Column() {
// 内容...
}
.backgroundColor(AppColors.CARD) // #B8FFFFFF
.border({ width: 1, color: AppColors.LINE, radius: 16 }) // 淡色边框
.shadow({ radius: 20, color: '#0A141E3C', offsetY: 4, offsetX: 0 }) // 轻投影
.backdropBlur(10) // 可选:背景模糊(真正的毛玻璃效果,性能消耗略高)
5.2 毛玻璃效果原理
页面背景:#F4F6FB(浅灰蓝固态色)
↓ 叠加
卡片背景:rgba(255,255,255,0.72)(半透明白色)
↓ 视觉混合
结果:带蓝灰色调的柔和白色 → 视觉上类似毛玻璃
5.3 与真实毛玻璃的区别
// 真实毛玻璃(需要 backdropBlur)
Column()
.backgroundColor('#B8FFFFFF') // 半透明底色
.backdropBlur(10) // 背景内容模糊(对下层内容生效)
// 仿毛玻璃(无 backdropBlur,性能更好)
Column()
.backgroundColor('#B8FFFFFF') // 半透明底色
// 因为页面背景是纯色,半透明白色叠加后视觉上已接近毛玻璃
六、颜色调试技巧
6.1 快速验证颜色格式
// 在临时代码中用 Text 显示颜色值,方便调试
Text(`CARD: ${AppColors.CARD}`)
.backgroundColor(AppColors.CARD)
.padding(10)
.border({ width: 1, color: '#000000' })
6.2 Alpha 计算工具函数
// 工具函数:根据颜色 hex 和透明度生成 ArkUI #AARRGGBB 格式
function withAlpha(hexColor: string, opacity: number): string {
// hexColor: '#RRGGBB' 格式
// opacity: 0.0 - 1.0
const alpha = Math.round(opacity * 255)
.toString(16)
.padStart(2, '0')
.toUpperCase()
return `#${alpha}${hexColor.slice(1)}`
}
// 使用示例
withAlpha('#4F7CFF', 0.12) // → '#1F4F7CFF'
withAlpha('#FFFFFF', 0.72) // → '#B8FFFFFF'
七、常见颜色问题 FAQ
Q1:设置了 backgroundColor 但没有显示
可能原因:
- 颜色格式错误(Alpha=00 = 完全透明)
- 父组件
backgroundColor(Color.Transparent)覆盖了子组件 clipContent(true)裁剪了背景
Q2:为什么 TEXT_2 写成 #68708A 而不是用透明度?
// 方案A:使用透明度(对深色背景有渗透效果)
static readonly TEXT_2: string = '#8014141E' // 50% 透明深色
// 方案B:使用固态色(视觉更稳定)
static readonly TEXT_2: string = '#68708A' // 蓝灰固态色
// 号码助手选择方案B:
// 固态色在不同背景下颜色一致,无需考虑背景颜色的影响
Q3:border color 能用透明颜色吗?
// ✅ 可以:透明颜色的 border 创造「虚线感」层次
.border({ width: 1, color: '#14141E3C', radius: 16 })
// 8% 透明深色边框 = 极淡边框,只提供轮廓感,不抢眼
八、颜色格式转换工具函数
在日常开发中,经常需要在 CSS 的 RGBA 和 ArkUI 的 ARGB 之间转换。以下工具函数可以直接复用到项目中:
/**
* CSS rgba() → ArkUI #AARRGGBB
* 示例:rgbaToArgb(255, 255, 255, 0.72) → '#B8FFFFFF'
*/
function rgbaToArgb(r: number, g: number, b: number, a: number): string {
const alpha = Math.round(a * 255)
.toString(16)
.padStart(2, '0')
.toUpperCase()
return `#${alpha}${toHex(r)}${toHex(g)}${toHex(b)}`
}
function toHex(n: number): string {
return n.toString(16).padStart(2, '0').toUpperCase()
}
/**
* ArkUI #AARRGGBB → CSS rgba()
* 示例:argbToRgba('#B8FFFFFF') → 'rgba(255,255,255,0.72)'
*/
function argbToRgba(argb: string): string {
const a = parseInt(argb.slice(1, 3), 16) / 255
const r = parseInt(argb.slice(3, 5), 16)
const g = parseInt(argb.slice(5, 7), 16)
const b = parseInt(argb.slice(7, 9), 16)
return `rgba(${r},${g},${b},${a.toFixed(2)})`
}
实用技巧:将这两个函数放在项目的
utils/ColorUtils.ets中,团队共用。当设计稿给出 CSS 颜色值时,用rgbaToArgb一键转换。
九、本篇小结
| 知识点 | 核心要点 |
|---|---|
| ArkUI 颜色格式 | #AARRGGBB(Alpha 在最前!)不是 #RRGGBBAA |
| Alpha 换算 | 百分比 × 255 → 取整 → 转十六进制 |
| 72%透明 | B8(0.72×255=183.6→B8) |
| 毛玻璃效果 | #B8FFFFFF 半透明 + 淡边框 + 浅灰蓝页面背景 |
| 5种颜色格式 | 字符串/Color枚举/rgb()/rgba()/数字值 |
| 调试方法 | 临时 Text + backgroundColor 可视化验证 |
参考资料
- 鸿蒙应用开发实战【03】— ArkUI 设计令牌体系构建
- 鸿蒙应用开发实战【10】— HarmonyOS NEXT 开发常见坑
- 鸿蒙应用开发实战【15】— LinearGradient 线性渐变
- 鸿蒙应用开发实战【19】— 统计卡片颜色语义
- ArkUI 颜色枚举参考
- backgroundColor 属性
- backdropBlur 属性
- shadow 属性
- WCAG 颜色对比度规范
- ARGB 颜色空间说明
- CSS rgba() 函数 MDN
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
更多推荐

所有评论(0)