设计最近换了新的字体包,使用后,垂直情况下总是不居中,改了行高,换语言就不行了,iOS改好了,Android又不行
一、问题
1. iOS 居中,Android 却不居中
原因:测试给的字体垂直度量不一致。 英文字库的 hhea 与 OS/2 typo 两套指标,上下空间分配不同。不同平台取用不同指标,使相同布局下的基线和留白不同,产生视觉偏移。
| 平台 | 指标组 | 原始:上升 / 下降 / 额外行距 | 修复后 |
|---|---|---|---|
| iOS | hhea | 1050 / -274 / 0 | 1029 / -295 / 0 |
| Android | OS/2 typo | 750 / -250 / 324 | 1029 / -295 / 0 |
什么是字体垂直度量(Vertical Metrics)?
字体垂直度量决定了文字在垂直方向上的布局空间,主要包含三个指标:
- Ascent(上升高度) :基线到字体上方的距离。
- Descent(下降高度) :基线到字体下方的距离。
- Line Gap(额外行距) :字体建议在行与行之间增加的空间。

2. 中文居中,英文却不居中
原因:字体包的英文、中文、日文字体自然行高不同,固定行高倍率无法通用。
- Flutter Material 主题有默认行高,未设置不是 Auto, 比如
bodyMedium是1.43。 - 将英文写死行高,虽然英文居中 了,但改变了中文的行框和留白,导致中文又偏移了。
二、解决方式
1. 统一英文字体指标
统一 hhea 与 OS/2 typo 的上升、下降和行间距,并校准基线;保留字形、字宽和总行高。
2. 全局主题默认使用 Auto,适应不同语言
在全局主题中默认设置 height: kTextHeightNone,让各语言使用自身字体的自然行高。它的值 0 表示原生行高,不是零高度。