无法使Flash Runtime Shared Library正常工作

时间:2011-10-18 02:04:25

标签: flash fonts shared-libraries embedded-fonts rsl

我正在为我的项目使用Flash CS5(资产)和FlashDevelop(代码)。我们有大约20个包含文本字段的fla / swf。我们所有的文本字段都使用相同的字体,字体特定于我们公司,因此不会安装在任何计算机上,因此需要嵌入。

我的最终目标是嵌入一个所有文本字段使用的单一字体,主要有两个原因:

  • 每当我们为字体(其他语言)添加更多字符时,我们只需要添加一次而不是20次
  • 文件大小不会大幅爆炸

我在努力实现这一目标时遇到了很大困难。似乎我尝试的所有内容都缺少了字符(只有在每个fla中文本字段的text属性中输入的字符才会被嵌入)。

我正在尝试的最新解决方案是使用运行时共享库​​,因为它似乎应该可以工作。我有一个名为FNFont.fla的fla。它只包含库中的一个对象,即嵌入字体。该字体将导出到AS3,在第1帧中导出并导出以供运行时共享。 URL是FNFont.swf(所有swf都在同一个文件夹中)。

在所有其他fla中,我在字体嵌入中创建了字体对象。我勾选导入运行时共享,并给它与FNFont.fla中的类名相同。 URL是FNFont.swf。 fla(s)包含许多使用此字体的文本字段。文本字段中有自己的实例作为其他动画片段的子项。

当我运行程序并尝试加载包含其中一个文本字段实例的动画片段时,我收到错误:

[Fault] exception, information=ReferenceError: Error #1065: Variable FontName is not defined.

FontName是FNFont.fla中Font对象的类名和所有其他fla。它不是textfield的实例名称(也不是类名),所以我不明白它是如何认为它是一个变量。有人能够对此有所了解吗?

由于

3 个答案:

答案 0 :(得分:1)

根据我的经验,您需要动态创建新的TextFields

您无法使用已在TextFields中编译的SWF,否则您会遇到上述问题。

这是一个让人很难爱Adobe的小错误之一。

答案 1 :(得分:0)

您可能想要搜索“运行时字体加载”,例如:

http://www.mokisystems.com/blog/flash-as3-loading-fonts/

...或

http://nochump.com/blog/archives/20

创建字体资源SWF:

package {

    import flash.display.Sprite;

    public class FontLibrary extends Sprite {

        [Embed(systemFont='Bank Gothic', fontName='emBank Gothic', mimeType='application/x-font')]
        public static var BankGothicFont:Class;

    }

}

从您的应用加载并注册SWF:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(new URLRequest("fontlibrary.swf"));

private function completeHandler(event:Event):void {
    var FontLibrary:Class = event.target.applicationDomain.getDefinition("FontLibrary") as Class;
    Font.registerFont(FontLibrary.BankGothicFont);
    var tf:TextField = new TextField();
    tf.defaultTextFormat = new TextFormat("emBank Gothic", 12, 0);
    tf.embedFonts = true;
    tf.rotation = 15; // to demonstrate the embed worked
    tf.text = "blah blah blahnblah blah blahnblah blah blah ";
    addChild(tf);
}

答案 2 :(得分:0)

前一段时间我遇到了类似的问题,结果证明在加载程序中设置正确的ApplicationDomain是一个问题。

我不确定你是否有类似的情况,但这是我的。

  • CS5.5
  • 我在库中有几个字体fonts.swf。它们每个都设置为Export for Runtime Sharing,并且它们被赋予了类名。
  • 有一个主要的swf,几个子swfs被加载。
  • 每个子swf都有没有嵌入的字体对象。字体对象设置为“Import for Runtime Sharing”,并且与fonts.swf具有相同的类名。

在我的情况下,第一个子swf会正确加载fonts.swf并访问字体。尝试访问字体的第二个子swf 重新加载fonts.swf,我会得到你在上面描述的相同错误。

在我看来,Flash正在尝试不重新加载字体,因为它假设它们已经注册了整个应用程序。但是,由于每个child.swf都使用默认的ApplicationDomain加载到父级,因此子级可以访问父级的类路径,但不能相互访问。因此,第一个孩子可以访问fonts.swf中的字体,但第二个孩子没有,因为他们是兄弟姐妹,而不是父母。

我相信有两种解决方法:

  1. 在任何孩子尝试访问之前,将fonts.swf加载到父swf中。
  2. ApplicationDomain设置为ApplicationDomain.currentDomain,以便子swfs与主要父swf共享相同的ApplicationDomain。
  3. 我选择了选项2,它为我解决了问题。

    var context : LoaderContext = new LoaderContext();
    context.applicationDomain = ApplicationDomain.currentDomain;                
    var clipLoader:Loader = new Loader();
    clipLoader.load(url, context);