动态加载显示内容

Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本

可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中:

  • 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite、MovieClip 或扩展 Sprite 的任何类。在 iOS 上的 AIR 应用程序中,只能加载不包含 ActionScript 字节代码的 SWF 文件。这意味着可以加载包含嵌入数据(如图像和声音)的 SWF 文件,但不能加载包含可执行代码的 SWF 文件。

  • 图像文件 — 包括 JPG、PNG 和 GIF 文件。

  • AVM1 SWF 文件 — 用 ActionScript 1.0 或 2.0 编写的 SWF 文件。(在移动 AIR 应用程序中不受支持)

使用 Loader 类可以加载这些资源。

加载显示对象

Loader 对象用于将 SWF 文件和图形文件加载到应用程序中。Loader 类是 DisplayObjectContainer 类的子类。Loader 对象在其显示列表中只能包含一个子显示对象,该显示对象表示它加载的 SWF 或图形文件。如下面的代码所示,在显示列表中添加 Loader 对象时,还可以在加载后将加载的子显示对象添加到显示列表中:

var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
this.addChild(pictLdr);

加载 SWF 文件或图像后,即可将加载的显示对象移到另一个显示对象容器中,如本示例中的 container DisplayObjectContainer 对象:

import flash.display.*; 
import flash.net.URLRequest; 
import flash.events.Event; 
var container:Sprite = new Sprite(); 
addChild(container); 
var pictLdr:Loader = new Loader(); 
var pictURL:String = "banana.jpg" 
var pictURLReq:URLRequest = new URLRequest(pictURL); 
pictLdr.load(pictURLReq); 
pictLdr.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);  
function imgLoaded(event:Event):void 
{ 
    container.addChild(pictLdr.content);  
}

监视加载进度

文件开始加载后,就创建了 LoaderInfo 对象。LoaderInfo 对象用于提供加载进度、加载者和被加载者的 URL、媒体的字节总数及媒体的标称高度和宽度等信息。LoaderInfo 对象还调度用于监视加载进度的事件。

下图说明 LoaderInfo 对象的不同用途 — 用于 SWF 文件的主类的实例、用于 Loader 对象以及用于由 Loader 对象加载的对象:

可以将 LoaderInfo 对象作为 Loader 对象和加载的显示对象的属性进行访问。加载一开始,就可以通过 Loader 对象的 contentLoaderInfo 属性访问 LoaderInfo 对象。加载完显示对象后,也可以通过显示对象的 loaderInfo 属性,将 LoaderInfo 对象作为已加载显示对象的属性进行访问。已加载显示对象的 loaderInfo 属性是指与 Loader 对象的 contentLoaderInfo 属性相同的 LoaderInfo 对象。换句话说,LoaderInfo 对象是加载的对象与加载它的 Loader 对象之间(加载者和被加载者之间)的共享对象。

要访问加载的内容的属性,需要在 LoaderInfo 对象中添加事件侦听器,如下面的代码所示:

import flash.display.Loader; 
import flash.display.Sprite; 
import flash.events.Event; 
 
var ldr:Loader = new Loader(); 
var urlReq:URLRequest = new URLRequest("Circle.swf"); 
ldr.load(urlReq); 
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded); 
addChild(ldr); 
 
function loaded(event:Event):void 
{ 
    var content:Sprite = event.target.content; 
    content.scaleX = 2; 
}

有关详细信息,请参阅处理事件

指定加载上下文

通过 Loader 类的 load()loadBytes() 方法将外部文件加载到 Flash Player 或 AIR 中时,可以选择指定 context 参数。此参数是一个 LoaderContext 对象。

LoaderContext 类包括三个属性,用于定义如何使用加载的内容的上下文:

  • checkPolicyFile:仅当加载图像文件(不是 SWF 文件)时才会使用此属性。如果将此属性设置为 true,Loader 将检查策略文件的原始服务器(请参阅网站控制(策略文件))。只有内容的来源域不是包含 Loader 对象的 SWF 文件所在的域时才需要此属性。如果服务器授予 Loader 域权限,Loader 域中 SWF 文件的 ActionScript 就可以访问加载图像中的数据;换句话说,可以使用 BitmapData.draw() 命令访问加载的图像中的数据。

    请注意,来自 Loader 对象所在域以外的其他域的 SWF 文件可以通过调用 Security.allowDomain() 来允许特定的域。

  • securityDomain:仅当加载 SWF 文件(不是图像)时才会使用此属性。如果 SWF 文件所在的域与包含 Loader 对象的文件所在的域不同,则指定此属性。指定此选项时,Flash Player 将检查策略文件是否存在,如果存在,来自跨策略文件中允许的域的 SWF 文件可以对加载的 SWF 内容执行跨脚本操作。可以将 flash.system.SecurityDomain.currentDomain 指定为此参数。

  • applicationDomain:仅当加载使用 ActionScript 3.0 编写的 SWF 文件(不是图像或使用 ActionScript 1.0 或 2.0 编写的 SWF 文件)时才会使用此属性。加载文件时,通过将 applicationDomain 参数设置为 flash.system.ApplicationDomain.currentDomain,可以指定将该文件包括在与 Loader 对象相同的应用程序域中。通过将加载的 SWF 文件放在同一个应用程序域中,可以直接访问它的类。如果要加载的 SWF 文件中包含嵌入的媒体,这会很有帮助,您可以通过其关联的类名访问嵌入的媒体。有关详细信息,请参阅使用应用程序域

下面的示例在从另一个域加载位图时检查策略文件:

var context:LoaderContext = new LoaderContext(); 
context.checkPolicyFile = true; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/photo11.jpg"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

下面的示例在从另一个域加载 SWF 时检查策略文件,以便将该文件与 Loader 对象放在同一个安全沙箱中。此外,该代码还将加载的 SWF 文件中的类添加到与 Loader 对象的类相同的应用程序域中:

var context:LoaderContext = new LoaderContext(); 
context.securityDomain = SecurityDomain.currentDomain; 
context.applicationDomain = ApplicationDomain.currentDomain; 
var urlReq:URLRequest = new URLRequest("http://www.[your_domain_here].com/library.swf"); 
var ldr:Loader = new Loader(); 
ldr.load(urlReq, context);

有关详细信息,请参阅用于 Adobe Flash Platform 的 ActionScript 3.0 参考中的 LoaderContext 类。