As3 字体嵌入

6
我看到很多关于在Flash中嵌入字体的问题,但是我似乎找不到答案解决我的问题。
我从一个字体swf文件中加载字体,并在高级别注册它们,以便可以在子swf中使用。问题是子swf也可能嵌入这些字体,但并没有明确地嵌入,这意味着它们只是由于子swf中的字段使用某些字符而被嵌入。这意味着子代中的文本字段将使用不完整的嵌入字体而不是在父级或任何祖先级别中注册的完整嵌入字体集。这也意味着可能成为此子级别的子元素的swf文件将无法获得完整的字体。
我的问题是: 有没有办法告诉flash在编译时不要嵌入字体到swf中,无论什么情况下?如果没有,是否有一种工具可以从已编译的swf文件中删除已经嵌入的字体?
以下是我思考/注意到的一些事情:
- 每个字体类似乎都与一个应用程序域相关联。(确认一下会很有帮助) - 在文本字段上使用设备字体不会导致任何字体被嵌入。(然而这对我来说不是一个选择,因为我需要在运行时从父级swf文件中嵌入字体到字段中。) - 我找不到一种方法来注销字体或仅仅告诉已加载的子swf使用父级字体,这对于应用于加载的子swf非常有用。 - 可能可以在不同的上下文中加载子元素,以允许父代字体定义覆盖子代定义。(或者是否会有两个定义,如果是,则哪一个优先?) - 从库中加载资产并将其添加到舞台上将获取父级字体的定义。(因为该资产是在子域之外创建的,这是有道理的。) - 可能的解决方案可能是在编译swf文件时不向文本字段添加任何字符,但这也不是一个选择,因为我需要使用任何字体的静态文本。
我已经开始在我的脑海中形成问题的定义,这可能是不正确的,因此,请必要时退后几步并给我提供一个不同的问题视角。到目前为止,似乎我上面问的问题是需要回答的正确问题,如果有解决办法,所有问题都将消失。
谢谢!

我有点笨,本以为理解了你的问题,并正在打字回答。但后来我意识到我不确定是否完全理解了你的问题。能否提供一些代码,这可以更清楚地呈现问题。 - Taurayi
你想将每个字体嵌入到它自己的SWF文件中,然后在需要时动态加载该SWF文件吗? - oxygen
我想在任何视图swf加载之前加载任意数量的字体。那部分不是问题。问题是从子swf中获取字体,以便在子swf中使用在子swf定义的字体之前加载字体并且不会与子swf的字体定义冲突。 - Jordan
这对于一个 RSL 来说不是完美吗? - The_asMan
我从未能够让rsl在字体方面正常工作。我唯一能让它正常工作的方法是在运行时加载swf并手动获取其中的字体引用。如果您可以编译一个没有任何字体的swf(可以使用大小报告或反编译swf进行检查),请告诉我您是如何做到的。我无法使用flash中的rsl选项使其正常工作。 - Jordan
3个回答

0

如果我理解正确,那么您想要移除/注销所有与已加载的特定字体版本不完整的字体,但这些字体嵌入在另一个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,但感谢您确认它是一个可能的解决方案。 - Jordan

0

我在使用Flash时遇到了很多字体方面的问题。即使在HTML中,不同的浏览器也会以不同的方式呈现,这仍然是一个问题。

无论如何,对于Flash,我建立了这个工具包,它帮助了我很多。查看如何自定义您的字体。如果您按照这些步骤操作,我相信问题将得到解决。

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


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

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

感谢 Adobe 浪费我的时间。


他们修复并记录了它,不是吗? - oxygen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接