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

标签 android fonts custom-font

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

问题:给定一个字符串,我如何自动决定哪个字体文件是最合适的,以便该字符串出现时没有被方 block /方框替换的字符?

注意事项:

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

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


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

最佳答案

Android 本身并不能提供足够的功能来完成这样的任务。在 Android 中加载和呈现字体发生在 Skia 中,它是用 C 编写的。Skia 检测是否在字体中找不到字符,并为此类字符(而不是整个字符串)回退到另一种字体。这就是日语、希伯来语或阿拉伯语文本在 Android 中的显示方式,这正是这些脚本没有粗体的原因! (他们的字体是通过回退选择的,回退只选择一个字体文件。)

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

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

获取每种字体的字符列表

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

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

选择字体

在上一部分之后,您将获得每种字体的 Unicode 字符列表,根据这些列表选择提供每个字符串中最多字符的字体文件是微不足道的。

关于Android:找出哪个字体文件适合我要显示的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7683753/

相关文章:

java - fragment 中的多个 AutoCompleteTextView

没有身份验证的 Android SyncAdapter 与 Android 服务

css - 多个字体粗细,一个@font-face 查询

css - @font-face 被 IE7 忽略

css - 如何在所有浏览器上正确导入自定义字体

android - uiautomator 与 Windows、Linux 和 MacOS 兼容吗?

android - Gradle从内置的apk中排除依赖导入的lib

css - Windows 上的 Firefox 中的大字体不流畅

ios - 无法打印自定义字体,ios

ios - 自定义字体未添加到项目中