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



我正在尝试为我的Firemonkey应用程序实现一个自定义字体系列(多个。otf文件,用于不同的权重,如heavy, light, regular, ultralight…),该应用程序将部署在Android和iOS上。

在iOS上实现字体系列非常简单,我所要做的就是将它们包含在信息中。plist文件。当对标签应用字体时,在font>我只需要输入"字体名称"它被应用了。请记住,没有实际的"字体名称"。字体名称Heavy"和其他权重

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

然而,当在Android上做同样的事情时,结果就完全不同了。我将字体包含在部署中,并输入"字体名称"。完全不适用,但是如果我输入字体名ultralight;例如,在iOS系统中,添加"Ultralight"没有效果)。更糟糕的是,为字体添加斜体和粗体等样式在Android上根本不适用,而在iOS上却可以应用。

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

对Delphi FMX中Android自定义字体的支持最近在Sydney 10.4中实现,在Alexandria 11中仍然处于初级阶段。当你注意到你必须进入"complete"字体名称,使其在Android上工作,因为没有官方支持字体权重。

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

  1. 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. 将赋值从
  2. 更改为FontFile
TPath.Combine(TPath.GetDocumentsPath, CurrentSettings.Family + '.otf');

:

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

(对。ttf也重复)

这应该增加对粗体的支持,斜体粗斜体用于Android。这可以进一步扩展以支持更多字体权重,只需检查单元FMX.Graphics.pas中的TFontWeightenum。

相关内容

  • 没有找到相关文章

最新更新