Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使Flash运行时共享库正常工作_Flash_Fonts_Shared Libraries_Embedded Fonts_Rsl - Fatal编程技术网

无法使Flash运行时共享库正常工作

无法使Flash运行时共享库正常工作,flash,fonts,shared-libraries,embedded-fonts,rsl,Flash,Fonts,Shared Libraries,Embedded Fonts,Rsl,我正在为我的项目使用FlashCS5(资产)和FlashDevelop(代码)。我们有大约20个fla/swf包含文本字段。我们所有的文本字段都使用相同的字体,并且该字体是我们公司特有的,因此不会安装在任何人的计算机上,因此需要嵌入该字体 我的最终目标是嵌入一种字体,供所有文本字段使用,主要原因有两个: 每当我们向字体(其他语言)添加更多字符时,我们只需要添加一次,而不是20次 文件大小不会急剧膨胀 我很难做到这一点。似乎我尝试的每件事都缺少字符(似乎只嵌入了每个fla中textfields

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

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

  • 每当我们向字体(其他语言)添加更多字符时,我们只需要添加一次,而不是20次
  • 文件大小不会急剧膨胀
我很难做到这一点。似乎我尝试的每件事都缺少字符(似乎只嵌入了每个fla中textfields的text属性中输入的字符)

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

在所有其他fla中,我在字体嵌入中创建字体对象。我为运行时共享勾选Import,并为其指定与FNFont.fla中相同的类名。URL是FNFont.swf。fla包含许多使用此字体的文本字段。textfield有自己作为其他movieclips的子对象的实例

当我运行该程序并尝试加载包含这些文本字段之一的实例的movieclip时,会出现以下错误:

[Fault] exception, information=ReferenceError: Error #1065: Variable FontName is not defined.
FontName是FNFont.fla和所有其他fla中字体对象的类名。它不是textfield的实例名(也不是类名),所以我不明白它是如何认为它是一个变量的。有人能解释一下吗


谢谢

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

或者

创建字体资源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);
}

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

不能使用已在
SWF
中编译的
TextFields
,否则会出现上述问题


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

我不久前遇到了类似的问题,结果发现这是在加载程序中设置正确的
ApplicationDomain
的问题

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

  • CS5.5
  • 我有一个
    font.swf
    ,库中有几种字体。它们每个都被设置为导出以供运行时共享,并且它们被赋予了一个类名
  • 有一个主swf,几个子swf被加载到其中
  • 每个子swf都有没有嵌入的字体对象。字体对象被设置为“为运行时共享导入”,并被赋予与fonts.swf相同的类名
在我的例子中,第一个子swf将正确加载font.swf并访问字体。第二个试图访问字体的子swf将不会重新加载font.swf,我将得到与上面描述的相同的错误

在我看来,Flash试图巧妙地避免重新加载字体,因为它假设字体已经在整个应用程序中注册。但是,由于每个child.swf都是使用默认的
ApplicationDomain
加载到父级中的,因此子级可以访问父级的类路径,但不能相互访问。因此,第一个子项可以访问
font.swf
中的字体,但第二个子项不能访问,因为它们位于同级,而不是父级

我相信有两种方法可以解决这个问题:

  • 在任何子级尝试访问fonts.swf之前,请将其加载到父级swf中
  • ApplicationDomain
    设置为
    ApplicationDomain.currentDomain
    ,以便子主权财富基金与主父主权财富基金共享相同的ApplicationDomain
  • 我选择了选项2,它为我解决了这个问题

    var-context:LoaderContext=new-LoaderContext();
    context.applicationDomain=applicationDomain.currentDomain;
    var clipLoader:Loader=new Loader();
    load(url、上下文);
    
    我以前试过这个,但没用。尽管我们可以看到字体正在被嵌入(通过使用enumerateFonts并在RegisterFont之后跟踪它们),仍然有许多字符丢失。在反编译了一些swf之后,我们注意到flash自动将字体嵌入到每个swf中,尽管我们在文本->字体嵌入中没有任何内容。嵌入的字符是库中每个textfield的Text属性中使用的字符。Textfields使用这些不可见的嵌入字体,而不是通过RegisterFont嵌入的字体。