从 Flash SWF 文件内,您可以加载其他外部 SWF 文件作为资产。有几个原因需要加载外部 SWF 文件:

  • 由于一个项目可拆分为多个影片,因此单个 SWF 文件的大小比较小。较小的文件加载速度更快,并且可以更有效地管理内存。  
  • 它使您能够根据用户在您的影片中执行的操作来仅加载所需的内容。
  • 多个 SWF 文件可以连续播放,而无需使浏览器加载其他 HTML 页面。页面没有将暂停或刷新与重新加载相关联。
  • 它为组织您的项目资产提供了更大的灵活性。
  • 可创建不依赖于单个 SWF 文件的复杂用户界面。可将许多 SWF 文件合并在一起以创建该界面。合并 SWF 文件可简化编辑,因为可以修订较小的单个 SWF 文件同时又不影响界面的其他部分。
  • 多位作者可以通过处理不同的 FLA 文件来协作完成同一个项目。

将内容置于单独的 SWF 文件中类似于将内容置于其自身的影片剪辑符号中。其不同之处在于,内容存在于主 SWF 文件外部。您也可以加载图像文件,例如 JPG、PNG、GIF。

要从其他 SWF 文件中加载外部 SWF 文件,请使用以下选项之一:

  • ActionScript 3.0 Loader
  • ActionScript 2.0 loadMovie 命令
  • ActionScript 2.0 MovieClipLoader

使用 ActionScript 3.0 Loader 类

ActionScript 3.0 中的 Loader 类是 DisplayObject 的一个子类,可用于加载和显示外部内容。要加载 SWF 文件,可使用此类的 load 方法。load 方法具有一个必需参数,该参数是包含要加载内容的 URL 地址的 URLRequest 实例。

以下代码示例创建了一个 Loader 实例,并加载了一个名为“myExternalMovie.swf”的外部 SWF 文件。

var myLoader:Loader = new Loader();                     // create a new instance of the Loader class
var url:URLRequest = new URLRequest("ExternalSWF.swf"); // in this case both SWFs are in the same folder 
myLoader.load(url);                                     // load the SWF file
addChild(myLoader);                                     // add that instance to the display list, adding it to the Stage at 0,0

// (optional)
myLoader.x = 10;                                        // move the loaded SWF 10 pixels to the right (from the left edge)   
myLoader.y = 175;                                       // move the loaded SWF 175 pixels down from the top

// (optional) load a second external SWF file
var my2ndLoader:Loader = new Loader();
var url2:URLRequest = new URLRequest("ExternalSWF2.swf");
my2ndLoader.load(url2);
addChild(my2ndLoader);                                  // optionally, you could put the 2nd SWF beneath 
                                                        // the 1st by using addChildAt(my2ndLoader, 1);
                                                        // displacing the 1st SWF from position 1 to 2 in the display list

// (optional) scaling of the 2nd SWF file
my2ndLoader.scaleX = 2;                                 // scale the SWF horizontally by 200%
my2ndLoader.scaleY = 2;                                 // scale the SWF vertically by 200%

所加载的 SWF 文件 URL 可以是相对路径也可以是绝对路径。请参阅下面的相对路径以了解有关 Flash Player 如何处理 URL 的更多信息。有关 Loader 类的更多信息,请参阅《平台 ActionScript 语言参考》中的 Loader

root(如果可用)的引用始终反映 SWF 文件所表示的显示列表树结构部分中的最顶层显示对象。(对于图像,root 引用位图对象。)

注意:在 ActionScript 3.0 中,没有等同于 ActionScript 2.0 _lockroot_level 的属性。请参阅《ActionScript 3.0 开发人员指南》中的显示编程基础知识

使用 ActionScript 2.0 loadMovie 命令

loadMovie 命令可将外部 SWF 文件或图像加载到 MovieClip 中或 ActionScript 2.0 内其他级别的父影片中。

loadMovie 命令具有两种不同的形式:

  • MovieClip.loadMovie 方法:MovieClip 方法用于将外部内容加载到特定的影片剪辑实例中。
  • 全局 loadMovie 函数:全局 loadMovie 函数可用于将内容加载到影片或级别中。全局版本还有两个变体,即 loadMovieloadMovieNum。第一个变体将内容加载到影片或级别中,第二个变体 (loadMovieNum) 专门将内容加载到级别中。

MovieClip.loadMovie

在将外部内容加载到影片剪辑实例中时,Adobe 建议您使用 loadMovie 的 MovieClip 方法版本。此版本直接从要将内容加载到的影片剪辑中调用,并传递内容的 URL。

myMovieClipInstance.loadMovie("myExternalMovie.swf");  // here only the filename is given, indicating the SWF file 
                                                       // is in the same folder as the parent SWF.

所加载的内容 URL 可以是相对路径也可以是绝对路径。请参阅下面的相对路径以了解有关 Flash Player 如何处理 URL 的更多信息。

加载后的内容会显示在容器影片剪辑中。容器影片剪辑的位置以及其他基本属性将得以保留。但是,在容器影片剪辑内定义的任何自定义属性或函数不再存在。新内容将替换所有以前的内容(包括代码和类似于 onRelease 的事件处理程序)。因此,任何尝试对影片剪辑使用 onLoad 事件处理程序的操作都将无法执行。在这种情况下,请转而使用 MovieClipLoader 类(如下所示)。有关 MovieClip.loadMovie 的更多信息,请参阅《ActionScript 2.0 语言参考》中的 MovieClip.loadMovie

全局 loadMovie 和 loadMovieNum

loadMovie 命令还以全局函数的形式存在。此函数有两个必需参数:外部内容的 URL 和在其中加载内容的目标。目标参数可以是一个字符串,也可以是一个引用。以下代码行相当于将“myExternalMovie.swf”加载到名为 myContainer 的影片剪辑实例中:

loadMovie("myExternalMovie.swf", myContainer);    // the target myContainer is an object reference
loadMovie("myExternalMovie.swf", "myContainer");  // the target "myContainer" is a string

loadMovie 也可以将内容加载到 Flash Player 的不同级别中。Flash Player 中的级别类似于播放器层。多个影片可在同一个 Flash Player 实例中播放,而无需互相嵌套。每个级别代表一个唯一的根,其中影片可以不依赖于其他级别内的影片而独立播放(无需使用 _lockroot)。

您可以在 ActionScript 中使用 _level 后跟一个表示级别编号的数字来引用级别。加载到 Flash Player 的第一个影片处于 _level0。其他级别会添加到该级别之上。以下对 loadMovie 的调用将“myExternalMovie.swf”加载到级别 1,位于播放器中当前播放的影片之上。

loadMovie("myExternalMovie.swf", "_level1");

全局 loadMovie 函数的一个变体为 loadMovieNum。此方法与 loadMovie 很相似,只是它仅定位级别,而且是按编号而不是按名称定位。例如,要将一个外部 SWF 文件加载到级别 1 (_level1),可使用以下方法:

loadMovieNum("myExternalMovie.swf", 1);

在加载到级别时,Adobe 建议您使用 loadMovieNum 而非 loadMovie。有关更多信息,请参阅《ActionScript 2.0 语言参考》中的全局 loadMovie 部分。

使用 _lockroot 防止 _root 冲突

在将外部影片加载到其他影片中时,所加载的影片剪辑的 _root 引用会从其主时间轴更改为加载它的影片的时间轴。换句话说,_root 将始终引用层次结构中的最顶层时间轴。如果您不希望 _root 引用最顶层时间轴,请将加载的影片剪辑主时间轴的 _lockroot 属性设置为 true。此属性指示该时间轴的所有子项在引用 _root 时需引用该时间轴。

this._lockroot = true;     // add this code in the main timeline of the SWF file that will be loaded into another SWF

注意:_lockroot 属性仅在发布到 Flash Player 7 或更高版本时才可用。

使用 ActionScript 2.0 MovieClipLoader 类

ActionScript 2.0 中的 MovieClipLoader 类可以简化将外部内容加载到 MovieClip 实例中的过程。如之前所述,在将新内容加载到影片剪辑后,在这些影片剪辑中定义的变量和函数将被删除。无法执行类似于 onLoad 的回调。但是,MovieClipLoader 可作为这类事件的代理避开此限制。您可以创建单独的 MovieClipLoader 实例,以管理向其他影片剪辑中加载内容的操作。因此,这样就不会发生清除该影片剪辑内的变量或函数的情况。

在通过 MovieClipLoader 类将内容加载到影片剪辑中时,请首先为该类创建一个新实例。然后,使用 loadClip 将内容加载到目标影片剪辑中。在以下示例中,新内容将被加载到影片剪辑 myContainer 中。

var myLoader:MovieClipLoader = new MovieClipLoader();
myLoader.loadClip("myExternalMovie.swf", myContainer);

如果您希望了解内容加载过程,请在 MovieClipLoader 实例中使用 onLoadInit 事件处理程序。

var myLoader:MovieClipLoader = new MovieClipLoader(); 
myLoader.addListener(this); 
myLoader.loadClip("myExternalMovie.swf", myContainer); 

function onLoadInit(mc:MovieClip) 
    { 
        trace("content has been loaded into "+mc); 
    }

如果要进一步掌控有关将内容加载到影片剪辑中的信息,请使用 MovieClipLoader 类而不是 MovieClip.loadMovie。(例如,当您希望能够检查加载进度时,可使用此事件处理程序。)有关 MovieClipLoader 类的更多信息,请参阅《ActionScript 2.0 语言参考》中的 MovieClipLoader

注意:MovieClipLoader 类仅在发布到 Flash Player 7 或更高版本时才可用。

使用相对路径加载内容

LoaderloadMovie 中使用相对路径可能会产生混淆。由于任何 SWF 文件或影片剪辑的时间轴都可以执行 loadMovie 操作,那么请问“所加载的影片是相对于哪个时间轴的?”它相对于处在 _level0 的主时间轴,还是相对于执行影片加载操作的时间轴?答案很简单:加载的影片始终相对于加载它们的时间轴。请参阅相对 URL 未被正确引用 | Flash (tn_04157) 以查看有关相对路径的讨论,这也与加载外部 SWF 文件相关。

帧速率注意事项

在大多数情况下,加载的影片会继承父影片的帧速率。例如,帧速率为 12 fps 的 SWF 文件在被加载到帧速率为 24 fps 的影片中后,将以 24 fps 进行播放。唯一的例外是,当加载的影片在同步设为“流”的时间轴上包含声音时。只有在这种情况下,主影片才会继承加载的影片的帧速率,以确保该声音能够正常播放。

注意:ActionScript 3.0 允许您使用 Stage.frameRate 属性动态更改帧速率。

关键字:Flash Player, 加载影片; ActionScript; 脚本; 级别; 通知目标; 变量; 目标; 实例; SWF; loadMovie; tn_14190

本产品经 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 许可  Twitter™ 与 Facebook 中的内容不在 Creative Commons 的条款约束之下。

法律声明   |   在线隐私策略