如何从.ttf文件在画布上绘制字形

时间:2012-07-17 05:33:20

标签: android true-type-fonts

Android不能正确支持Urdu Nastaliq字体(单词被分解,并且没有单词的确切形状(Nastaliq))。

我使用Typeface作为

TextView tx=(TextView)this.findViewById(R.id.tt);
tx.setTypeface(Typeface.createFromAsset(getAssets(),"TTF font Path"));

我可以使用AWT软件包在

中获取Java中Nastaliq字体的确切格式
Font font = Font.createFont(Font.TRUETYPE_FONT, new File("Path for ttf file"));
Font dynamicFont32Pt =   font.deriveFont (32f);
JLabel textLabel = new JLabel(textMessage);
textLabel.setFont(dynamicFont32Pt);

但Android也不支持AWT包正确(java.awt.Font.createFont()deriveFont()),所以我们决定为乌尔都语的.ttf文件制作一个渲染引擎。

现在我的问题是 -

  1. 我们可以在Android中获取urdu Font(正确)渲染而无需渲染引擎吗? 如果没有,那么
  2. 如何在Android中阅读.ttf文件(所有表格如'glyp','head')?
  3. 如何绘制TTF字体,即不需要PNG的矢量字体?

2 个答案:

答案 0 :(得分:2)

Extracting glyph-path information from ttf files问题的答案可能让您感兴趣:基本上,它指向Batik库,它具有用Java解析TTF文件的代码(将其转换为SVG)。

答案 1 :(得分:0)

您应该检查我的问题How to use kerning pairs extracted from a TTF file to correctly show glyphs as Path2D in Java?。建议不要使用蜡染,而是使用Apache FOP。它简单易用。优点是您只读取一次字体,并将字形嵌入到应用程序中。但是,Apache FOP仅适用于TTF,不适用于OTF(也可以,但我仍在努力)。 Batik使用Java AWT渲染字符串。问题是您的应用程序每次运行时都需要读取字体文件。在这种方法中,我建议您可以使用嵌入式的迷你矢量化字体,也可以对小文本使用嵌入式的矢量化字符串。这种方法的问题是,宽度仅在绘制时才能正常工作。为了能够使用通过awt从字体文件中恢复的字形,您需要直接从文件中读取字距调整对和宽度,以便能够正确显示文本。 question的答案对此进行了解释。同时检查问题How to read kerning pairs table from TTF file in Android?。使用矢量化字形的优点是您的应用程序独立于字体文件和操作系统。

您可以看到我在Windows上使用此系统,但对于Android也可以这样做。字体在Windows上更易于处理,大多数字体都有TTF。实际上,您可以在Windows上开发矢量字体,而仅在Android中使用生成的类。这就是这种方法的优点。我使用println生成字体并将其复制并粘贴到新的类文件中。我什至不用去写文件。