当一个 ArkUI 应用从首页扩展到实时字幕、OCR、任务、历史和设置,最先失控的往往不是业务逻辑,而是页面里散落的颜色、圆角、间距和阴影。听见课堂把这些视觉决策集中在 AppTheme.ets,让 12 个主页面与手语、文字沟通页面共享同一套语义。

Theme Token 连接多页面视觉系统

一、Token 解决的是变化传播问题

如果每个页面都写 16#FFFFFF20,单页看起来也许正确,但暗色模式、phone 压缩和 2in1 大屏重排会迫使开发者逐处搜索。Token 的价值不是少写几个常量,而是让一次设计决策有唯一入口。

项目把颜色放进 AppColors,把布局和材质参数放进 AppSizes。页面引用语义名,不直接猜具体值。

二、颜色名必须表达用途

PRIMARYTEXT_PRIMARYSURFACE_READABLEBORDER_GLASS 分别表示操作强调、主文字、可读表面和玻璃边界。相比 BLUE_1WHITE_80,用途名能告诉调用者“为什么用”。

static readonly PRIMARY: string = '#087EA4';
static readonly TEXT_PRIMARY: string = '#102A43';
static readonly SURFACE_READABLE: string = '#B8FFFFFF';
static readonly BORDER_GLASS: string = '#C7FFFFFF';

当品牌色或材料透明度改变时,调用页不用知道新色值,只继续消费同一语义。

三、表面不是只有一张白卡

项目定义了 SURFACE_GLASSSURFACE_READABLESURFACE_SOFTSURFACE_INPUTSURFACE_FLAT。它们对应不同的信息密度:主内容要保证阅读,辅助区可以更轻,输入区要和展示区可区分。

同一页面若全部使用最强玻璃和最大阴影,层级反而消失。Token 让“主卡、普通卡、软提示”有可复用的材料梯度。

四、暗色不是给背景取反

每类关键表面都有 _DARK 版本,分割线、阴影和危险状态也单独定义。暗色下继续使用浅色半透明白,会造成发灰;只把背景变黑,则会让边界、禁用态和文字对比失去控制。

页面通过 preferences.darkMode 选择语义 Token,暗色适配仍然集中在主题层,而不是在每个 Builder 中复制一套十六进制色值。

五、尺寸 Token 同时承担布局契约

PAGE_PADDINGCARD_PADDINGCARD_RADIUS 是通用尺寸;phone 又有更紧凑的 PHONE_PAGE_PADDINGPHONE_SECTION_GAP 和导航高度。

static readonly TOUCH_MIN: number = 48;
static readonly PHONE_PAGE_PADDING: number = 16;
static readonly PHONE_TOP_BAR_HEIGHT: number = 52;
static readonly PHONE_BOTTOM_NAV_HEIGHT: number = 64;
static readonly LARGE_BREAKPOINT: number = 840;

这些值不是纯装饰。底栏高度、安全区、内容滚动范围和触达目标都依赖它们。

六、48vp 是交互面积,不是图标尺寸

底栏图标可以是 22vp,但承载它的按钮应提供至少 48vp 的有效触达区域。若开发者把 TOUCH_MIN 直接理解成图标边长,视觉会笨重;若只把 22vp 图标设为可点击,键鼠和触屏都容易误操作。

因此 Token 需要和组件结构一起使用:外层控制响应区,内层图像控制视觉尺寸。

七、模糊分成 Hero、Card、Soft 三档

项目使用 GLASS_BLUR_HERO=30GLASS_BLUR_CARD=24GLASS_BLUR_SOFT=18。Hero 用于导航壳或核心焦点,Card 用于主要内容容器,Soft 用于轻提示或次级块。

这三档形成明确层级,也避免每个页面随手写一个 blur 值。模糊仍须和表面透明度、边框、阴影共同评估,不能单独决定可读性。

颜色、间距、圆角、模糊和触达尺寸流向不同设备组件

八、phone 与 large 不应只有等比放大

phone 页面边距为 16vp、顶栏 52vp、底栏 64vp;大屏侧栏宽度是 248vp,并在内容区保留更宽的外边距。大屏需要信息分栏和键鼠焦点,手机需要拇指可达和沉浸式内容,两者不能靠整体缩放完成。

共享 Token 保证风格一致,设备分支 Token 保证布局合理,这两件事并不冲突。

九、新组件应先选语义再写样式

新增卡片时先回答:它是主要阅读、辅助信息还是输入?是否需要点击?是否在暗色中出现?phone 和 large 是否共用结构?确认语义后再组合 SURFACE_*BORDER_*、blur、radius 和 padding。

如果现有 Token 无法表达新语义,应先审查是否真的出现了新材料层级,而不是立即在页面里硬编码。

十、Token 不能替代组件封装

集中常量只能统一原子决策,重复的卡片结构、状态图标和导航按钮仍应封装为 Builder 或共享组件。否则十几个页面虽然颜色相同,内部对齐、按压态和无障碍文本仍会漂移。

最佳边界是:Token 管视觉语言,组件管结构和交互,页面只负责组合当前业务内容。

十一、验收要查使用结果而非常量存在

静态检查可搜索页面中的裸色值、零散圆角和小于 48vp 的交互容器;运行验收还要覆盖浅色、暗色、phone、835vp 附近窗口和宽屏。长标题、空态与错误态同样要进入矩阵。

Token 文件存在不代表页面真正复用。最终证据应来自源码引用、UI 树尺寸和实际截图三类结果。

十二、边界与下一步

当前主题系统已覆盖项目的主要材料与尺寸,但它不是自动化 Design System:字体层级仍有页面内配置,系统 1.5 倍字体和真实屏幕阅读器也不能由 Token 测试替代。

统一 12 个页面的关键,是让颜色、尺寸和材料有稳定语义,让响应式差异留在合理分支中。下一篇继续拆解大屏 LargeAuroraBackground 如何形成连续光场,同时不截获任何交互。

Logo

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

更多推荐