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

Posted

技术标签:

【中文标题】将 .otf 字体系列部署到 FMX 应用程序【英文标题】:Deploying .otf font family to FMX application 【发布时间】:2021-11-28 11:27:07 【问题描述】:

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

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

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

但是,在 Android 中做同样的事情时,结果却完全不同。我在部署中包含字体,输入“字体名称”根本不应用它,但是如果我输入“字体名称 Ultralight”,那么具有该重量的字体就会被应用(在 iOS 上,添加“Ultralight”没有效果)。 更糟糕的是,为字体添加样式(如斜体和粗体)根本不适用于 Android,而它们却适用于 iOS。

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

【问题讨论】:

在 iOS 上,使用存储在文件中的实际字体名称。在 Android 上,它是文件名减去扩展名。确保文件名与您希望使用的字体名称匹配,并且在两者上都一样 @DaveNottage 在经历了类似的问题后,我得出以下结论:1. Delphi FMX 不支持“Regular”和“Bold”以外的字体粗细,2. 在 Android 上大量部署自定义字体与 iOS 不同。我很惊讶还没有人解决这个问题,所以我会尽力解决它并自己回答这个问题。 【参考方案1】:

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

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

    从类TAndroidFontGlyphManager 中找到过程LoadResource。您可以看到 FMX 如何查找仅采用 Family 名称和文件扩展名的字体。 检查内部过程CreateTypefaceFromFamilyName 以及它如何确定当前字体的粗细。 按照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';
    将分配更改为FontFile
TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + '.otf');

到:

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

(对 .ttf 也重复)

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

【讨论】:

以上是关于将 .otf 字体系列部署到 FMX 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

OTF 字体的正确 MIME 类型

OTF 字体的正确 MIME 类型

如何在fabricJS中应用.otf字体?

如何从 otf 或 ttf 文件中获取字体名称?

如何将日文 OTF 字体转换为与 FOP 一起使用

Visual Studio 2015 无法识别 OTF 转换字体 (UWP)