【问题标题】:As3 font embeddingAs3 字体嵌入
【发布时间】:2012-10-10 11:44:47
【问题描述】:

我看到很多与 Flash 中的字体嵌入相关的问题,但我似乎无法找到问题的答案。

我从字体 swf 加载字体并在高级别注册它们,以便它们可以在子 swf 中使用。问题是子 swf 也可能嵌入这些字体,但没有明确地嵌入,这意味着它们只是嵌入,因为子 swf 中有使用字体的某些字符的字段。这意味着子项中的文本字段使用不完整的嵌入字体,而不是在父项或任何级别的祖父项中注册的嵌入完整集。这也意味着可能成为这个孩子的孩子的 swf 不会获得完整的字体。

我的问题: 有什么方法可以在编译时告诉 flash 在任何情况下都不要将字体嵌入到 swf 中?如果没有,是否有从编译的 swf 中删除嵌入字体的工具?

到目前为止,我已经考虑过/注意到了一些事情:

  • 似乎每个 Font 类都绑定到一个 ApplicationDomain。 (确认这一点会有所帮助)
  • 在文本字段中使用设备字体不会导致嵌入任何字体。 (但对我来说不是一个选项,因为我需要这些字段在运行时从父 swf 嵌入字体。)
  • 我找不到取消注册字体或简单地告诉加载的子 swf 使用父字体的方法,这对于应用到加载的子 swf 很有用。
  • 可以将子项加载到不同的上下文中,这将允许字体的父定义覆盖子定义。 (或者会有两个定义,如果有,哪个优先?)
  • 从子库加载资源并将它们添加到舞台将获得字体的父定义。 (这是有道理的,因为资产是在子域之外创建的)
  • 一种可能的解决方案可能是不向文本字段添加任何字符以编译 swf,但这也不是一个真正的选择,因为我需要使用任何字体的静态文本。

我已经开始对我认为可能不正确的问题进行定义,因此,如有必要,请退后几步,让我对问题有不同的看法。到目前为止,我上面提出的问题似乎是正确的问题,如果有解决方案,我的所有问题都会消失。

谢谢!

【问题讨论】:

  • 我有点傻,我以为我理解了你的问题,并且正在输入答案,然后我意识到我不是 100% 确定我是否完全理解你的问题。您能否提供一些代码,它有助于为我画出更清晰的画面。
  • 您想将每种字体嵌入到自己的 swf 中,然后在需要时动态加载该 swf?
  • 我想在加载任何视图 swf 之前加载任意数量的字体。那部分不是问题。问题是从子 swfs 中取出字体,以便在子 swfs 之前加载的字体可以在子 swfs 中使用,并且不会与子 swfs 字体的定义冲突。
  • 这不是 RSL 的完美选择
  • 我从来没有能够让 rsl 为字体工作。我可以让它工作的唯一方法是在运行时加载 swf 并手动从中获取字体引用。如果您可以在没有任何字体的情况下编译 swf(检查使用大小报告或反编译 swf),请发布您是如何做到的。我无法使用 Flash 中的 rsl 选项使其工作。

标签: actionscript-3 fonts flash embedding


【解决方案1】:

如果我的理解是正确的,那么您是否想要删除/取消注册所有不完整的字体作为已加载但嵌入另一个 swf 的特定字体的版本?

嵌入的每个字体都会创建一个类,通过 Loader 类加载的每个 swf 默认情况下都加载到其自己的应用程序域中,以防止命名空间冲突,但您可以强制加载器将所有内容加载到当前应用程序域中Loader 的 load() 方法的 »loader context« 参数。因此,您可以尝试强制在同一命名空间中相互覆盖类,但是您无法控制要丢弃的类,这意味着您无法检查哪种字体具有更多字形。 (也许它只是抛出错误而不是覆盖并且根本不运行,我对此不太确定)。

另一方面,您应该质疑字体实际上是如何嵌入到孩子的 swf 文件中的。我知道除了嵌入字体之外别无他法:

在 *.fla 文件中作为»库符号«, 或在 flashbuilder 或 flex 的代码中,如下所示: [Embed(source="c:/windows/fonts/verdana.ttf", fontFamily="Verdana", embedAsCFF="false")],

或者这个:

@font-face {
    src: url("../assets/MyriadWebPro.ttf");
    fontFamily: myFontFamily;
    advancedAntiAliasing: true;
}

在 mxml 文件中。所以(这就是我猜的)生成的类的结果名称取决于开发人员给出的»font-family«属性(甚至更多设置),这意味着即使相同的字体嵌入了两倍的类-名称可能因设置而异。

也没有Font.unregisterFont() 方法,所以如何管理这仍然是一个很好的问题,以防万一您可能以某种方式找到相同的 Font 类(也许 RegExp 成为一个友好的助手)。

我认为要正确解决此问题,您需要在编译时进行控制,使用基于 xml 的 *.xfl 项目文件可能会有所帮助,但即使引用的字体文件可以有不同的名称。

一个很好的问题,祝你好运

【讨论】:

  • 感谢您的回复。当动态文本字段设置为动画或可读性的抗锯齿时,也会发生字体嵌入,这真的很烦人,因为你只能在字段中输入几个字符。此外,静态文本会导致用于将字体定义编译到没有字符的 swf 中,因此具有静态文本字段也会阻止该 swf(或应用程序域)中的任何内容使用相同字体的父定义。我今天早些时候开始研究解压缩 flas,但感谢您确认这是一个可能的解决方案。
【解决方案2】:

我在使用 Flash 字体时遇到了很多问题。在不同浏览器以不同方式呈现的html上仍然是一个问题。

无论如何,对于 Flash,我构建了这个对我有很大帮助的工具包。检查如何自定义字体。如果您执行这些步骤,我很确定问题将得到解决。

https://github.com/tbwa/AS3-Toolkit/tree/master/src/com/utils/text

【讨论】:

    【解决方案3】:

    原来这是我的 Flash Professional 版本的一个错误。我进行了更新,现在可以使用运行时共享字体。我可能会将共享字体指向字体的错误 url,然后字体将来自父应用程序域,因为它们没有编译到子 swfs 中。我现在使用的是 Flash Professional CS5.5 11.5.1。我使用的是 CS5.5 11.5.0。

    http://forums.adobe.com/message/3926344

    感谢 Adob​​e 浪费我的时间。

    【讨论】:

    • 他们修复并记录了它,不是吗?
    猜你喜欢
    • 2011-12-10
    • 2013-07-17
    • 2011-11-16
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多