Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:找出哪个字体文件适合我想要显示的字符_Android_Fonts_Custom Font - Fatal编程技术网

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

Android:找出哪个字体文件适合我想要显示的字符,android,fonts,custom-font,Android,Fonts,Custom Font,我正在维护一个Android应用程序,人们用它来显示各种异国语言的字符串,比如藏语或古希腊语。由于Android设备的字体很少,用户可以将字体文件放在SD卡上,应用程序将使用它们 问题:给定一个字符串,我如何自动确定哪个字体文件最合适,以便该字符串显示时不会用方框/方框替换字符 注: 每个字符串都使用一种语言 字符串显示在Web视图中 自定义字体工作,唯一的问题是决定使用哪个字体文件 它可以提供该字符串可接受的字体列表,而不是单个字体 不必要的上下文,出于好奇:我正在尝试开发此功能:

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

问题:给定一个字符串,我如何自动确定哪个字体文件最合适,以便该字符串显示时不会用方框/方框替换字符

注:

  • 每个字符串都使用一种语言
  • 字符串显示在Web视图中
  • 自定义字体工作,唯一的问题是决定使用哪个字体文件
  • 它可以提供该字符串可接受的字体列表,而不是单个字体
不必要的上下文,出于好奇:我正在尝试开发此功能:


更新:我最终根据Mostafa的想法创建了开源库。

它有一个
getSuitableFonts
方法,速度非常快。

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

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

  • 准备每个字体文件中可用的字符列表
  • 对于每个字符串,找到字符串中包含更多字符的字体
  • 获取每种字体中的字符列表

    你不必在Android应用程序中即时完成这项工作。您可以准备每种字体的字符列表,并将这些列表放入应用程序中。我之所以这么说,是因为使用Android中可能没有的工具更容易做到这一点。我会通过字体应用程序中的Python脚本来实现这一点(大多数严肃的字体工具都有很棒的Python脚本环境),但这些应用程序非常昂贵,适合严肃的类型设计人员使用。既然你是Android开发者,我建议使用爪哇和C++的一个库。使用SFN可以轻松完成所需的操作(获取字体文件中可用的Unicode字符列表)。与CMap表(包含字符到字形映射的表)一起使用,应该是一个很好的起点

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

    选择字体


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

    我将您的想法作为开源实现:我希望许多人会找到它,使用它并扩展它:-)@NicolasRaoul哦,太棒了。很高兴它有帮助,也很高兴你分享了你的解决方案。snftly在Android上运行良好。然而,使用它又引出了一个问题。有人知道Skia使用哪种cmap表吗?我猜这是Unicode表的全部或一个子集(请参阅),但最好能确定。