将 .otf 字体系列部署到 FMX 应用程序
Posted
技术标签:
【中文标题】将 .otf 字体系列部署到 FMX 应用程序【英文标题】:Deploying .otf font family to FMX application 【发布时间】:2021-11-28 11:27:07 【问题描述】:我正在尝试为我的 Firemonkey 应用程序实现一个自定义字体系列(多个 .otf 文件,用于不同的权重,例如重、轻、常规、超轻……),它将同时部署在 android 和 ios 上。
在 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 的 Bold、Italic 和 Bold Italic 的支持。这可以进一步扩展以支持更多字体粗细,只需检查单元 FMX.Graphics.pas
中的 TFontWeight
枚举。
【讨论】:
以上是关于将 .otf 字体系列部署到 FMX 应用程序的主要内容,如果未能解决你的问题,请参考以下文章