问题
在影片播放时,你想加载外部图像进来
解决办法
用 Loader 类来加载一个图像(.jpg、.png、.gif)和在屏幕上显示它
讨论
在第9.17节中有示范怎么样在编辑时,通过 [Embed]元数据标签,绑定外部资源到一个影片中。在运行时,为了加载一个外部图像或者影片,需要用到 Loader 类。
flash.display.Loader 类非常类似 flash.net.URLLoader 类。不同的关键在于,Loader 实例能加载外部图像和影片,在屏幕上显示它们,然而 URLLoader 实例对于传递数据非常有用。
加载外部内容有三个基本步骤:
-
建立一个 Loader 类的实例
-
添加 Loader 实例到可视化列表中
-
调用 load() 方法加载外部资源
load() 方法为下载图像或者.swf 文件负责,它带一个 URLRequest 对像用为参数,这个参数是资源的地址。
下面的例子是用 Loader 实例下载一个名叫 image.jpg 的图像,下面有注释前面所说的3个步骤:
package { import flash.display.*; import flash.net.URLRequest; public class LoaderExample extends Sprite { public function LoaderExample( ) { // 1. 建立实例 var loader:Loader = new Loader( ); // 2. 添加实例到显示列表 addChild( loader ); // 3. 调用 load()方法 loader.load( new URLRequest( "image.jpg" ) ); } } }
一旦资源已下载完成,它自动地被添加 作为 Loader 实例的一个孩子
当加载外部资源的时候,在加载进程中有可能会发生一些错误,例如,指向的地址拼写错误,或者是沙箱安全因素不让资源被加载,又或者是资源太大,将会要花很长时间下载。在下载资源的时候,屏幕是空的,你可能会想要显示下载的进度。
碰到这些问题,你需要添加事件侦听器到 Loader 实例的 contentLoaderInfo 属性,它可以显示它们发生时的不同事件。contentLoaderInfo 属性是 flash.display.LoaderInfo 类的实例,提供目标在下载时的信息。
-
下面是LoaderInfo 类的实例的事件列表
-
当资源开始下载发生
progress
-
在资源下载的过程中发生
complete
-
在资源下载完成时发生
init
-
当加载一个 .swf 它的属性和方法可用时发生
httpStatus
在加载时,HTTP 请求失败时发生
-
当一个重大的错误产生,导致下载失败,像找不到资源
securityError
-
沙箱安全因素
unload
当调用 unload()方法删除已加载的内容,或者再次调用 load()方法替换已经加载完的
open
ioError
下面的例子示范了侦听加载一个图像时,与下载进程有关联的各种事件:
package { import flash.display.*; import flash.text.*; import flash.net.URLRequest; import flash.events.*; public class LoaderExample extends Sprite { public function LoaderExample( ) { // Create the loader and add it to the display list var loader:Loader = new Loader( ); addChild( loader ); // Add the event handlers to check for progress loader.contentLoaderInfo.addEventListener( Event.OPEN, handleOpen ); loader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, handleProgress ); loader.contentLoaderInfo.addEventListener( Event.COMPLETE, handleComplete ); // Load in the external image loader.load( new URLRequest( "image.jpg" ) ); } private function handleOpen( event:Event ):void { trace( "open" ); } private function handleProgress( event:ProgressEvent ):void { var percent:Number = event.bytesLoaded / event.bytesTotal * 100; trace( "progress, percent = " + percent ); } private function handleComplete( event:Event ):void { trace( "complete" ); } } }