mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-18 22:46:38 +08:00
11 KiB
11 KiB
AtomUI 字体系统 — 总览
本文档描述 AtomUI 字体系统的整体设计架构。AtomUI 字体系统建立在 Avalonia 的
EmbeddedFontCollection和FontManager基础之上,结合 AtomUI 的 Design Token 主题系统,实现了从字体包嵌入、字体族注册、Token 驱动的字体大小/行高派生,到运行时全局字体切换的完整能力。
1. 设计背景与目标
1.1 Ant Design 5.0 排版规范
Ant Design 5.0 在排版(Typography)方面有如下设计要求:
- 字体族(Font Family):优先使用系统默认界面字体,同时提供备用字体库,在不同平台保持良好的易读性和可读性。
- 字体大小(Font Size):以 14px 为基准字号,通过数学公式自动派生出从小号到一级标题的完整字号梯度。
- 行高(Line Height):与字号配套,遵循
(fontSize + 8) / fontSize的计算公式自动派生。 - 字重(Font Weight):标题类组件使用
SemiBold,正文使用Normal。
AtomUI 在 .NET / Avalonia 平台完整还原了这一排版设计。
1.2 AtomUI 字体系统的三大集成点
┌───────────────────────┐ ┌─────────────────────────┐ ┌──────────────────────┐
│ 字体包(Font Package)│ │ Design Token 主题系统 │ │ AXAML 资源绑定 │
│ │ │ │ │ │
│ EmbeddedFontCollection│────►│ Seed Token: FontFamily │────►│ {atom:SharedToken- │
│ 字体文件嵌入 (.ttf) │ │ Map Token: FontSize* │ │ Resource FontFamily}│
│ 自定义 URI Scheme │ │ Alias Token: FontSize- │ │ {atom:SharedToken- │
│ (fonts:AlibabaSans) │ │ Icon, FontWeightStrong │ │ Resource FontSize} │
│ │ │ 算法派生字号/行高梯度 │ │ │
└───────────────────────┘ └─────────────────────────┘ └──────────────────────┘
- 字体包(Font Package) — 将字体文件(
.ttf/.otf)嵌入为 Avalonia 资源,通过EmbeddedFontCollection注册到FontManager,使字体在应用中全局可用。 - Design Token 主题系统 — 字体族作为 Seed Token (
FontFamily) 参与主题推导链,字号和行高通过主题算法自动派生为 Map Token 梯度。 - AXAML 资源绑定 — 控件主题通过
{atom:SharedTokenResource FontFamily}等标记扩展消费字体 Token,实现字体与主题的动态绑定。
1.3 设计目标
- 开箱即用 — 内置 Alibaba Sans 字体包,一行代码即可启用,无需依赖系统字体。
- Token 驱动 — 字号、行高、字重等排版属性全部由 Design Token 系统管理,修改 Seed Token 即可全局级联。
- 可扩展 — 开发者可以制作自己的字体包,替换默认字体或添加额外字体。
- 运行时可切换 — 通过修改 Token 资源字典中的
FontFamily值即可运行时切换全局字体。 - 跨平台一致性 — 字体包嵌入机制确保在 Windows/macOS/Linux(未来还有 iOS/Android)上字体显示一致。
2. 系统架构
2.1 组件关系图
┌──────────────────────────────────────────────────────────────────────────┐
│ 应用层(Application Layer) │
│ │
│ app.UseAtomUI(builder => { │
│ builder.UseAlibabaSansFont(); // 注册字体包 │
│ builder.UseDesktopControls(); │
│ builder.WithDefaultFontFamily(...) // 可选:覆盖默认字体 │
│ }); │
└─────────────────────────┬──────────────────────────────────┬─────────────┘
│ │
┌─────────────────────────▼────────────────┐ ┌──────────────▼─────────────┐
│ AtomUI.Fonts.AlibabaSans │ │ AtomUI.Core 主题系统 │
│ ┌─────────────────────────────────────┐ │ │ ┌──────────────────────┐ │
│ │ AlibabaSansFontCollection │ │ │ │ DesignToken │ │
│ │ : EmbeddedFontCollection │ │ │ │ .FontFamily (Seed) │ │
│ │ fonts:AlibabaSans → avares:// │ │ │ │ .FontSize (Seed) │ │
│ │ AtomUI.Fonts.AlibabaSans/Assets │ │ │ │ .FontSizeSM (Map) │ │
│ │ │─┼──► │ .FontSizeLG (Map) │ │
│ │ ThemeManagerBuilderExtensions │ │ │ │ ...更多 Map/Alias │ │
│ │ .UseAlibabaSansFont() │ │ │ └──────────┬───────────┘ │
│ │ │ │ │ │ │
│ │ AppBuilderExtension │ │ │ CalculatorUtils │
│ │ .WithAlibabaSansFont() │ │ │ .CalculateFontMap- │
│ └─────────────────────────────────────┘ │ │ TokenValues() │
└──────────────────────────────────────────┘ └─────────────────────────────┘
│
┌─────────────▼─────────────┐
│ 控件主题(Control Themes) │
│ │
│ WindowTheme.axaml: │
│ FontFamily="{atom: │
│ SharedTokenResource │
│ FontFamily}" │
│ │
│ PopupRootTheme.axaml: │
│ FontFamily="{atom: │
│ SharedTokenResource │
│ FontFamily}" │
└───────────────────────────┘
2.2 核心模块划分
| 模块 | 项目 | 职责 |
|---|---|---|
| 字体包 | AtomUI.Fonts.AlibabaSans |
内置 Alibaba Sans 字体嵌入、FontManager 注册 |
| 字体 Token | AtomUI.Core (Theme/TokenSystem/) |
Seed Token FontFamily/FontSize,Map Token 字号/行高梯度派生 |
| 字体梯度算法 | AtomUI.Core (Theme/Styling/CalculatorUtils.cs) |
从基准字号自动派生完整字号/行高序列 |
| 字体工具 | AtomUI.Core (Media/FontUtils.cs, TextUtils.cs) |
em 转 px 工具、文本尺寸测量工具 |
| 控件字体绑定 | AtomUI.Desktop.Controls (Themes/*.axaml) |
通过 Token 标记扩展在控件主题中消费字体 Token |
3. 文档索引
本字体系统文档拆分为以下子文档:
| 文档 | 描述 |
|---|---|
| Overview.md | 本文件 — 总览 |
| FontPackageDesign.md | 字体包内部设计原理(以 AtomUI.Fonts.AlibabaSans 为例) |
| FontTokenIntegration.md | 字体与 Design Token 系统的集成(Seed → Map → Alias 字体推导链) |
| UsingBuiltInFont.md | 开发者指南:在应用中使用 AtomUI 内置字体 |
| CreatingCustomFontPackage.md | 开发者指南:制作自定义字体包 |
| RuntimeFontSwitching.md | 运行时字体切换机制与实践 |
4. 源文件清单
AtomUI.Fonts.AlibabaSans
| 文件 | 职责 |
|---|---|
AlibabaSansFontCollection.cs |
字体集合定义,继承 EmbeddedFontCollection |
AppBuilderExtension.cs |
Avalonia AppBuilder 扩展方法(纯 Avalonia 场景) |
ThemeManagerBuilderExtensions.cs |
AtomUI IThemeManagerBuilder 扩展方法(AtomUI 主题场景) |
Properties/AssemblyInfo.cs |
XAML 命名空间定义 (XmlnsDefinition) |
AtomUI.Fonts.AlibabaSans.csproj |
项目文件,配置 AvaloniaResource 嵌入字体文件 |
Assets/*.ttf |
6 个字重的 Alibaba Sans 字体文件 |
AtomUI.Core(字体相关)
| 文件 | 职责 |
|---|---|
Theme/TokenSystem/TokenDefinitions/DesignToken.Seed.cs |
Seed Token:FontFamily、FontSize |
Theme/TokenSystem/TokenDefinitions/DesignToken.FontMap.cs |
Map Token:字号梯度、行高梯度、文字高度 |
Theme/TokenSystem/TokenDefinitions/DesignToken.Alias.cs |
Alias Token:FontSizeIcon、FontWeightStrong |
Theme/TokenSystem/TokenDefinitions/DesignToken.cs |
Alias 计算逻辑(CalculateAliasTokenValues) |
Theme/Styling/CalculatorUtils.cs |
字体梯度派生算法(CalculateFontMapTokenValues、CalculateFontSize) |
Theme/ThemeManagerBuilder.cs |
WithDefaultFontFamily() API |
ApplicationExtensions.cs |
UseAtomUI() 中的字体覆盖逻辑 |
Media/FontUtils.cs |
em 到 px 转换工具 |
Media/TextUtils.cs |
文本尺寸计算工具 |