可变字重设成 450 却跳回 400:HarmonyOS 7 连续字重与设备级粗细怎么一起验
HarmonyOS 7 的设计动态明确提出支持多语言连续字重变化。落到 ArkUI 时,开发者仍要区分两个开关:是否允许非整百字重生效,以及是否跟随设备的字体粗细级别。只写一个 450 并不能保证所有组件、字体和设备都显示成预期粗细。
证据边界:本文把华为官方资料、可执行的应用侧模型和待补的 API 26 设备证据分开记录。当前本机 SDK 为 API 24,且没有连接 HarmonyOS 7 真机;文中的 TypeScript 断言用于验证状态与边界,不冒充 API 26 编译、云端联调或真机结果。接入时应以目标版本官方文档、控制台配置和真实错误码为准。
复现:450 为什么看起来和 400 一样
官方 API 说明中,enableVariableFontWeight=false时,非整百数值会回到默认 400;开启后才允许 100 到 900 的任意整数参与可变字重。与此同时,字体文件本身也要支持可变调节。
案例一:阅读页跟随系统粗细
正文适合保留设备级字体粗细,让低视力用户的系统设置能够生效。测试时要覆盖 400、450、600 等档位,并检查换行是否变化。
案例二:品牌数字必须稳定
金额、验证码或图表刻度若因为设备设置变粗后挤压布局,可以明确关闭设备级字重跟随,但仍要保证可读性和无障碍放大。
先把配置决策写成函数
type FontPolicy = { variable: boolean; followDevice: boolean; requested: number }; function effective(p: FontPolicy): number { if (p.requested < 100 || p.requested > 900) return 400; if (!p.variable && p.requested % 100 !== 0) return 400; return p.requested; } if (effective({ variable: false, followDevice: true, requested: 450 }) !== 400) throw new Error('非整百回退错误'); if (effective({ variable: true, followDevice: true, requested: 450 }) !== 450) throw new Error('可变字重未生效');不只看“粗不粗”
连续字重会影响字符宽度、行高观感和按钮文案空间。中文、英文、数字和不支持可变轴的备用字体都要分别看。动效过程中还要关注频繁重排,不能为了视觉变化让长列表持续抖动。
验收矩阵
- 可变字重开启与关闭。
- 设备字体粗细不同级别。
- 中文、英文、数字和混排。
- 支持与不支持可变字重的字体。
- 手机、平板、电脑窗口缩放。
官方资料
1. HarmonyOS 设计语言与可变字体
2. ArkUI 文本字体配置 API
3. HarmonyOS 7 新能力一览