Flash / AS3中的运行时字体加载

时间:2008-10-22 08:54:44

标签: flash actionscript-3 fonts external

想象一下,您正在创建一个演示文稿,该演示文稿将被翻译成十几种不同的语言,包括具有非拉丁字符的语言(例如中文)。客户的品牌风格指南规定某些字体可以接受某些字体。内容本身需要外部化,以便可以在不打开.fla或重新保存图形的情况下替换文本。

所以我们讨论动态TextField,从XML填充,换出字体以适应查看者的语言环境 - 动态加载所需字体(无论文件大小)的最无痛方法是什么,并将它们应用为必要?我正在寻找使用 Flash而不是Flex 的解决方案。

4 个答案:

答案 0 :(得分:2)

这在flash中有点麻烦,但它完全有可能。您需要做的是将字体“嵌入”在单独的swf中,从主应用程序加载此swf,然后在该swf内注册该字体。这将允许您执行字体的运行时加载。 这将要求您指定应用程序中的每种语言的字体或您存储翻译的任何文件,这可能并不完美,但也不是在主应用程序中嵌入所有字体。这可能无缘无故地加载了数百kb的字体。

This blog post很清楚你需要做些什么才能让它发挥作用。我也是自己做的,所以如果你感兴趣我可以稍后用一些例子来扩展这篇文章。

答案 1 :(得分:1)

我完全失望,没有人知道这件事 - 哦,好吧。我终于找到了一个写了一个小类来处理字体加载过程的人,并给出了如何创建.swfs以加载它的指示:

Flash AS3 Loading Fonts

希望其他人会觉得这很有用 - 结果证明这是我解决问题的灵丹妙药。

答案 2 :(得分:0)

嗯,你会知道如何知道你正在加载什么语言。自动检测可能非常困难。

假设您知道内容是什么语言,您可以使用Font.registerFont()注册要在运行时使用的字体;通过这种方式,您可以加载包含字体的swf,注册它,并且可以在将来在所有文本字段中使用。 print(“code sample”);

[Embed(src="someFont.ttf", fontFamily="myFont", mimeType="application/x-font")]
private var fontClass:Class;

...

Font.registerFont(fontClass);

请注意,您必须使用flex编译器进行编译以支持Embed标记。

另外一个好的实用程序是Font.hasGlyphs(),您可以使用它来检查您使用的字符是否以嵌入字体提供。这可以用于跳回系统字体或作为开发人员向您显示警告(如果您忘记了某些字符或其他内容)。对TextField进行子类化以自动执行此检查可能是一个好主意。

如果这是在线,一般来说,嵌入中文是你应该考虑两次的事情。嵌入所有字符会增加文件大小很多,而且还没有那么多完整的中文字体可用。上述技术当然对许多其他语言仍然有用。

答案 3 :(得分:0)

首先,请确保设定期望值,以便没人认为您将使用亚洲语言(如中文和日文)中的嵌入字体。除非您计划加载几兆字形的字形,否则您将使用设备字体,完全停止。因此,有关使用 class 字体的指南是合理的 - _sans_serif_typewriter或其本地化的等价物 - 但不是指南字体本身。

其次,在过去,我的方法一直是让人们相信,在大多数情况下,无论如何,他们可能会更好地使用设备字体。使用设备字体将缩短您的开发时间并避免错误。它将使您的内容加载速度更快(如果通过网络),并且在几乎所有情况下都会更快地呈现。通常,它也会更清晰易读。

客户喜欢要求所有正文都在Garamond-Extra-British或其他任何地方,但要确保他们知道所涉及的费用。如果他们看到光明,你就会为自己带来巨大的痛苦。