将 .otf 字体系列部署到 FMX 应用程序

Deploying .otf font family to FMX application

我正在尝试为我的 Firemonkey 应用程序实现一个自定义字体系列(多个 .otf 文件用于不同的权重,例如重、轻、常规、超轻...),它将部署到 Android 和 iOS.

在 iOS 上实现字体系列非常简单,我所要做的就是将它们包含在 info.plist 文件中。将字体应用于标签时,在“字体”>“系列”下,我只需要键入“字体名称”即可应用。请记住,没有实际的“字体名称”文件,只有“字体名称 Heavy”和其他权重。

额外的问题,我如何在 FMX 中使用字体粗细?我没有找到任何设置字体粗细的 属性。

然而,在Android中做同样的事情,结果完全不同。我在部署中包含字体,输入“字体名称”根本不会应用它,但是如果我输入“字体名称 Ultralight”,例如,将应用具有该重量的字体(在 iOS,添加“Ultralight”没有效果)。 更糟糕的是,向字体添加样式(例如斜体和粗体)根本不会应用到 Android,而它们会应用到 iOS.

为什么这两个行为如此不同,如何克服差异使它们显示相同的东西?

Delphi FMX 最近在 Sydney 10.4 上实现了对 Android 中的自定义字体的支持,从 Alexandria 11 开始,它仍然处于初级阶段。正如您所注意到的,您必须输入“完整”字体名称使其在 Android 上工作,因为目前还没有对字体粗细的官方支持。

但是,您仍然可以通过编辑和重新编译位于 Delphi 安装文件 FMX.FontGlyphs.Android.pas 中的一些源代码来达到您想要的结果。你可以这样做:

  1. 从 class TAndroidFontGlyphManager 中找到过程 LoadResource。您可以看到 FMX 如何查找仅采用家族名称和文件扩展名的字体。
  2. 检查内部程序 CreateTypefaceFromFamilyName 以及它如何确定当前字体的粗细。
  3. 遵循 CreateTypefaceFromFamilyName 的逻辑,在初始化 FontFile 变量之前添加类似的内容(不要忘记声明 FontStyle):
FontStyle:='';
if not CurrentSettings.Style.Slant.IsRegular and not CurrentSettings.Style.Weight.IsRegular then
    FontStyle:=' Bold Italic'
else if not CurrentSettings.Style.Weight.IsRegular then
    FontStyle:=' Bold'
else if not CurrentSettings.Style.Slant.IsRegular then
    FontStyle:=' Italic';
  1. 将分配更改为 FontFile 来自:
TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + '.otf');

至:

TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + FontStyle + '.otf');

(.ttf 也重复)

这应该添加对 BoldItalicBold Italic[=49= 的支持] 对于 Android。这可以进一步扩展以支持更多字体粗细,只需检查单元 FMX.Graphics.pas 中的 TFontWeight 枚举。