代码之家  ›  专栏  ›  技术社区  ›  matt lohkamp

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

  •  2
  • matt lohkamp  · 技术社区  · 16 年前

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

    因此,我们讨论的是动态文本字段,它由XML填充,并交换字体以适应查看器的区域设置——动态加载所需字体(不管文件大小如何)并在必要时应用它们的最简单的方法是什么?我正在寻找解决方案 仅闪烁,不灵活 .

    4 回复  |  直到 15 年前
        1
  •  2
  •   grapefrukt    16 年前

    这在Flash中有点麻烦,但这是完全可能的。您需要做的是将字体“嵌入”到一个单独的SWF中,从主应用程序加载这个SWF,然后在该SWF中注册该字体。这将允许您在运行时加载字体。 这将要求您要么在应用程序中指定每种语言的字体,要么在存储翻译的任何文件中指定字体,这可能并不完美,但也不会在主应用程序中嵌入所有字体。这可能意味着无需任何理由就可以加载数百KB的字体。

    This blog post 对你需要做的事情有一个很好的总结。我自己也这样做了,所以如果你感兴趣,我可以在后面用一些例子来扩展这篇文章。

        2
  •  1
  •   matt lohkamp    16 年前

    我对没人知道这件事感到非常失望-哦,好吧。最后我找到了一个编写了一个小类来处理字体加载过程的人,并给出了如何创建.swfs以便加载的指导:

    Flash AS3 Loading Fonts

    希望其他人会发现这对我有帮助——结果证明这是解决我问题的灵丹妙药。

        3
  •  0
  •   Antti    16 年前

    好吧,你得知道你要加载什么语言。自动检测可能非常困难。

    假设你知道内容是什么语言,你可以注册在运行时使用的字体 Font.registerFont() ;通过这个,您可以加载一个包含字体的SWF,并注册它,它可以在所有文本字段中供将来使用。 打印(“代码样本”);

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

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

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

    如果这是在线的,一般来说,嵌入中文是你应该三思而后行的事情。嵌入所有字符将增加文件大小 很多 阿法克也没有那么多完整的中文字体。当然,上面的技术对于许多其他语言仍然有用。

        4
  •  0
  •   fenomas    16 年前

    首先,确保你设定了期望值,这样就不会有人认为你会在中文和日语等亚洲语言中使用嵌入式字体。除非您计划加载几个兆字节的字形,否则您将使用设备字体,完全停止。因此,有合理的指导方针 要使用的字体- _sans , _serif , _typewriter 或其本地化等价物-但不是字体本身的准则。

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

    客户喜欢要求他们所有的正文都在英国以外的Garamond,但要确保他们知道所涉及的成本。如果他们看到光,你就可以减轻自己的巨大痛苦。