鸿蒙应用开发实战【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 但没有显示

可能原因:

  1. 颜色格式错误(Alpha=00 = 完全透明)
  2. 父组件 backgroundColor(Color.Transparent) 覆盖了子组件
  3. 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 可视化验证

参考资料

如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!


相关资源:

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐