Android:找出哪个字体文件适合我要显示的字符

Nic*_*oul 3 fonts android custom-font

我正在维护一个 Android 应用程序,人们用它来显示各种异国语言(如藏语或古希腊语)的字符串。由于Android设备自带的字体很少,用户可以将字体文件放在SD卡上,应用程序将使用它们。

问题:给定一个字符串,如何自动确定哪个字体文件最合适,以便该字符串出现时不会将字符替换为方块/框?

笔记:

  • 每个字符串都采用一种语言。
  • 字符串显示在 WebView 中。
  • 自定义字体可以使用,唯一的问题是决定使用哪个字体文件。
  • 它可以提供该字符串可接受的字体列表,而不是单一字体。

不必要的上下文,出于好奇:我正在尝试开发此功能: http: //code.google.com/p/ankidroid/issues/detail? id=779


更新:我最终根据 Mostafa 的想法创建了Antisquare开源库。
它有一个getSuitableFonts非常快的方法。

Mos*_*afa 5

Android 本身并不足以完成这样的任务。Android 中的加载和渲染字体是在 Skia 中进行的,它是用 C 语言编写的。Skia 会检测是否在字体中找不到某个字符,然后针对此类字符(而不是整个字符串)回退到另一种字体。这就是日语、希伯来语或阿拉伯语文本在 Android 中的显示方式,这正是这些脚本没有粗体的原因!(他们的字体是通过后备选择的,而后备仅选择一种字体文件。)

不幸的是,API 中没有提供这种机制,您必须自己构建类似的东西。看起来很复杂,但比看起来容易。您所要做的就是:

  1. 准备每个字体文件中可用的字符列表。
  2. 对于每个字符串,找到具有更多字符串字符的字体。

获取每种字体的字符列表

您不必在 Android 应用程序中即时执行此操作。您可以准备每种字体的字符列表并将这些列表放入您的应用程序中。我这么说是因为使用 Android 中可能不可用的工具会更容易。我会通过字体应用程序中的 Python 脚本来实现这一点(大多数严肃的字体工具都有很棒的 Python 脚本环境),但这些应用程序价格昂贵,而且适合严肃的字体设计师。由于您是 Android 开发人员,我建议使用sfntly,这是一个 Java 和 C++ 库。使用 sfntly 可以轻松完成您需要的操作(获取字体文件中可用的 Unicode 字符列表)。这个样本适用于 CMap 表(保存字符到字形映射的表),应该是您的一个很好的起点。

现在有趣的部分是 snftly 是用 Java 编写的,您可以将其包含在您的 Android 应用程序中并自动执行所有操作。这太棒了,我建议您从熟悉 snftly 开始。

选择字体

在完成上一部分之后,您将获得每种字体的 Unicode 字符列表,并且根据这些列表选择提供每个字符串的大多数字符的字体文件非常简单。

  • 我将你的想法作为开源实现:https://github.com/nicolas-raoul/Antisquare 我希望很多人会找到它、使用它并扩展它:-) (3认同)