在AS3中使用Loader来加载外部SWF和图像文件,Loader对象会提供一个容器来存放外部文.AS3不再充许像以前那样把外部文件加载到MC中,当然,因为as3不再有层级(_level)的概念,以加载外部SWF和图像文件到层级的方法也退役了.
(注:as1/as2中的loadMovie(),loadMovieNum(),MovieClipLoader等加载外部SWF和图像文件的法,在as3中都由Loader代替.)
创建Loader实例的方法与创建其它可视对象(display object)一样(new Loader()),然后使用ddChid()方法把实例添加到可视对象列表(display list)中,加载是通过Loader.load()方法理一个包含外部文件地址的URLRequest对象来实现的.有的DisplayObject实例都包含一个loadInfo属性,这个属性关联到一个LoaderInfo对象,此象提供加载外部文件时的相关信息。Loader实例除了这个属性,还包含另外一个ontentLoaderInfo属性,指向被加载内容的LoaderInfo属性。当把外部元素加载到Loader实时,可以通过侦听contentLoadInfo属性来判断加载进程,例如加载开始或者完成事件.
可以与LoaderInfo实例关联的事件有:
* complete:Event -当外部文件被加载完成时分派。complete事件通常在init事件后触发。
* httpStatus:HTTPStatusEvent-当通过HTTP协议请求加载外部文件时,且Flash Player可以检到HTTP状态的代码 。
* init:Event – 当被加载SWF文件的属性和方法可以被访问到时候触发,init事件先于omplete事件。
* ioError:Event – 由于输入/输出错误导致加载失败时触发.
* open:Event – 加载操作开始时调用。
* progress:ProgressEvent – 加载操作时接收到数据时调用。
* unload:Event – 加载对象被删除时调用。
简单示例:
var request:URLRequest = new URLRequest("content.swf");
var loader:Loader = new Loader();
loader.load(request);
addChild(loader);
上面的代码会在Loader实例中加载content.swf,当且仅当此影片被成功加载后,它才会在oader实例中显示出来,Loader实例已经被添加到可视列表中,所以这些内容也会被显示到屏上。
加载时检测错误发生:
var request:URLRequest = new URLRequest("content.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
function ioError(event:IOErrorEvent):void
{
trace(event);
}
try
{
loader.load(request);
}
catch (error:SecurityError)
{
trace(error);
}
addChild(loader);
这里的错误检查是用来检测加载过程中是否出现错误.
第一个是给Loader实例的contentLoaderInfo属性(不是Loader实例)关联一个ioError侦听器来获被加载元素的输入/输出错误。
第二个try-catch块,用来加载操作,Loader实例的load()方法会在下列情况下抛出ecurityError错误:
* LoaderContext.securityDomain值必须为null或者等于SecurityDomain.currentDomain。这以来你只有把要加载的文件放在受信任安全沙箱中,或者放在你自己域(需要一个策略文件),才能加载到这些文件..Loading a Cross-domain policy file
* 本地的SWF文件只能将LoaderContext.securityDomain设置为null,不充许在本地加载非本地件.
* 如果applicationDomain 或者 securityDomain 属性是一个不被信任的域。
* 本地SWF文件取不到securityDomain属性值.
建议: 注意检测错误,特别是同步(thrown)错误,因为当一个错误被抛出时, 当前程序块会迅速止执行. 同时,如果影片在debug版的Flash播放时,会抛出无法捕获的异常, 这些异常信息和步错误(那些未处理侦听事件)将出现在一个弹出对话框中.
一个preload示例:
var request:URLRequest = new URLRequest("content.swf");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
function loadProgress(event:ProgressEvent):void
{
var percentLoaded:Number = event.bytesLoaded/event.bytesTotal ;
percentLoaded = Math.round(percentLoaded * 100);
trace("Loading: "+percentLoaded+"%");
}
function loadComplete(event:Event):void
{
trace("Complete");
}
loader.load(request);
addChild(loader);
这里的contentLoaderInfo属性用来附加侦听器.PROGRESS事件用于获得加载过程中的数据信息当加载完成时,调用COMPLETE事件.这里为了表达清晰省去的错误检查的相关代码,在实际工作不能省去的.
英文原版地址:http://www.kirupa.com/forum/showthread.php?p=2112823#post2112823
中文翻译源地址:http://flashcoder.cn/blog/index.php/archives/16