代码改变世界

BulkLoader

2010-07-02 16:33  宝宝合凤凰  阅读(1884)  评论(6)    收藏  举报

http://code.google.com/p/bulk-loader/


BulkLoader是一个老外写的loader类。它能够对多个不同的外部文件进行队列下载,下载时能够获取单个对象的下载百分比和所有对象加起来的总体百分比~而且,能够对下载列表的优先级进行操作,还能够remove单个对象或者一次remove所有对象(呵呵~可以偷懒了:))十分方便!对象加载失败时还能够设定重试次数,如果超过重试次数,就放弃load这个对象。
下面这个是BulkLoader自带的一个例子

 

 

  1. package {
  2. import br.com.stimuli.loading.BulkLoader;
  3. import br.com.stimuli.loading.BulkProgressEvent;
  4. import flash.events.*;
  5. import flash.display.*;
  6. import flash.media.*;
  7. import flash.net.*;
  8. public class SimpleExampleMain extends MovieClip {
  9.   public var loader : BulkLoader;
  10.   public var v : Video;
  11.   public var counter : int = 0;
  12.   public function SimpleExampleMain() {
  13.    //构建BulkLoader的时候需要给它一个名称
  14.    loader = new BulkLoader("main-site");
  15.    //设置输出日志
  16.    loader.logLevel = BulkLoader.LOG_INFO;
  17.    //构建好了以后,通过add方法往队列里添加需要加载的对象
  18.    loader.add("http://www.emptywhite.com/bulkloader-assets/cats.jpg");
  19.    //添加加载对象时候,也可以给它添加一个id,方便以后调用
  20.    loader.add("http://www.emptywhite.com/bulkloader-assets/shoes.jpg", {id:"bg"});
  21.    //还可以通过priority属性调整加载对象的加载顺序,priority值越大,优先权越高,越早加载
  22.    loader.add("http://www.emptywhite.com/bulkloader-assets/samplexml.xml", {priority:20, id:"config-xml"});
  23.    //加载一个动画,加载动画的时候可以用pausedAtStart属性暂停播放动画
  24.    loader.add("http://www.emptywhite.com/bulkloader-assets/movie.flv", {maxTries:6, id:"the-video", pausedAtStart:true});
  25.    //maxTries属性用于设定加载失败时的重试次数,注意,这里的“id”用了字符串命名
  26.    loader.add("http://www.emptywhite.com/bulkloader-assets/chopin.mp3", {"id":"soundtrack", maxTries:1, priority:100});
  27.    //添加一个COMPLETE事件,这个事件会在队列里的所有对象都加载完毕后触发
  28.    loader.addEventListener(BulkLoader.COMPLETE, onAllItemsLoaded);
  29.    //添加一个PROGRESS事件,这个事件会在队列加载时不断触发。通常可以用于监听加载进度。
  30.    loader.addEventListener(BulkLoader.PROGRESS, onAllItemsProgress);
  31.    //队列编辑完毕后用star方法开始加载队列
  32.    loader.start();
  33.   }
  34.   public function onAllItemsLoaded(evt : Event):void {
  35.    trace("every thing is loaded!");
  36.    //建立一个Video对象
  37.    var video : Video = new Video();
  38.    //从队列里提取刚才加载的视频流
  39.    var theNetStream : NetStream = loader.getNetStream("the-video");
  40.    addChild(video);
  41.    video.attachNetStream(theNetStream);
  42.    theNetStream.resume();
  43.    video.y = 300;
  44.    //提取图片
  45.    //可以直接通过url提取对象
  46.    var bitmapCats : Bitmap = loader.getBitmap("http://www.emptywhite.com/bulkloader-assets/cats.jpg");
  47.    bitmapCats.width = 200;
  48.    bitmapCats.scaleY = bitmapCats.scaleX;
  49.    addChild(bitmapCats);
  50.    //当然,也可以通过id提取对象
  51.    var bitmapShoes : Bitmap = loader.getBitmap("bg");
  52.    bitmapShoes.width = 200;
  53.    bitmapShoes.scaleY = bitmapShoes.scaleX;
  54.    bitmapShoes.x = 220;
  55.    addChild(bitmapShoes);
  56.    //提取音频
  57.    var soundtrack : Sound = loader.getSound("soundtrack");
  58.    soundtrack.play();
  59.    //提取一个xml文档
  60.    var theXML : XML = loader.getXML("config-xml");
  61.    trace(theXML);
  62.   }
  63.   //通过BulkProgressEvent的loadingStatus方法可以显示加载过程中的所有信息!
  64.   public function onAllItemsProgress(evt : BulkProgressEvent):void {
  65.    trace(evt.loadingStatus());
  66.   }
  67. }
  68. }


 

 

 

BulkLoader是一个不错且使用简单的开源加载类,其能实现对不同类型文件的加载进行管理。

在尝试加载多个文件时候只要使用 add + 文件地址,在加载结束后使用 “get文件类型”+文件地址或加载时候注册的id去获得要得到的文件。

var loader : BulkLoader = new BulkLoader("main");
loader.add("bg.jpg");
loader.add("config.xml");
loader.add("soundtrack.mp3");
loader.add("intro.flv");
loader.addEventListener(BulkLoader.PROGRESS, onProgress);
loader.addEventListener(BulkLoader.COMPLETE, onComplete);
loader.start();
 
function onProgress(evt : BulkProgressEvent) : void{
    trace(evt.percentLoaded);
}
 
function onComplete(evt : Event) : void{
    var bgBitmap = loader.getBitmap("bg.jpg");
    addChild(bgBitmap);
    var video : Video = new Video();
    video.attachNetStream(loader.getNetStream("intro.flv"));
    parseConfig(loader.getXML("config.xml"));
}

通过 urls 来加载

// simplest case:
loader.add("logo.png");
 
// use an "id" so the item can be retrieved later without a reference to the url
loader.add("background.jpg", {id:"bg"});
 
// since the url by itself can't tell us what the filetype is, use the type property to let BulkLoader know what to do:
loader.add("/some-web-services?size=Large", {type:"image"});
 
// add an item that should be loaded first (higher priority):
loader.add("/data/config.xml", {priority:20});
 
// add a max try number (defaults to 3)
loader.add("/unreliable-web-services.xml", {maxTries:6});
 
// you can also use a URLRequest object , this will load from a POST request
 
var postRequest : URLRequest = new URLRequest("/save-prefs.php");
postRequest.method = "POST";
 
var postData : URLVariables = new URLVariables(myPostDataObject );
postRequest.data = postData;
loader.add(postRequest, {"id":"settings"});
 
// of course, all options can be combined:
loader.add("the-sound-webservices?name=maintrack", {"id":"soundtrack", type:"sound", maxTries:1, priority:100});

侦听事件。比较厉害的是可以通过加载时候注册的id或文件地址来侦听想要侦听的文件。

// attaching events to all items:

// this will fire once all items have been loaded
loader.addEventListener(BulkLoader.COMPLETE, onAllLoaded);

// this will fire on progress for any item

// the event , BulkProgress is a subclass of ProgressEvent (with extra information)
loader.addEventListener(BulkLoader.PROGRESS, onAllProgress);

// this will fire if any item fails to load:
// the event is BulkErrorEvent and holds an array (errors) with all failed LoadingItem instances
loader.addEventListener(BulkLoader.ERROR, onAllError);

// you can also listen to events in individual items              
// this will fire as soon as the item registred with the id of "bg" is done loading (even if there are other items to load)
loader.get("bg").addEventListener(Event.COMPLETE,onBackgroundLoaded)

// this will only trigged if the config.xml loading fails:
loader.get("data/config.xml").addEventListener(BulkLoader.ERROR, onXMLFailed);

Starting the loading operation

loader.start();

获取文件

var theBgBitmap : Bitmap = loader.getContent("bg") as Bitmap;
 
// you don't need to keep a reference to the loader intance, you can get it by name:
var theBgBitmap : Bitmap = BulkLoader.getLoader("main-site").getContent("bg") as Bitmap;
 
// you can also use the conviniece methods to get a typed object:
var theBgBitmap : Bitmap = loader.getBitmap("bg");
 
// grab a BitmapData directly:
var theBgBitmap : Bitmap = loader.getBitmapData("bg");
 
private function progessHandler(e:BulkProgressEvent):void{
  addChild(_txt);
  _txt.text = Math.floor(e.percentLoaded * 100).toString();
}

 

===============================

 

BulkLoader是一个老外写的loader类。它能够对多个不同的外部文件进行队列下载,下载时能够获取单个对象的下载百分比和所有对象加起来的总体百分比~而且,能够对下载列表的优先级进行操作,还能够remove单个对象或者一次remove所有对象(呵呵~可以偷懒了:))十分方便!对象加载失败时还能够设定重试次数,如果超过重试次数,就放弃load这个对象。
下面这个是BulkLoader自带的一个例子

package {
 import br.com.stimuli.loading.BulkLoader;
 import br.com.stimuli.loading.BulkProgressEvent;
 import flash.events.*;
 import flash.display.*;
 import flash.media.*;
 import flash.net.*;
 
 public class SimpleExampleMain extends MovieClip {
  public var loader : BulkLoader;
  public var v : Video;
  public var counter : int = 0;
 
  public function SimpleExampleMain() {
   //构建BulkLoader的时候需要给它一个名称
   loader = new BulkLoader("main-site");
   //设置输出日志
   loader.logLevel = BulkLoader.LOG_INFO;
   //构建好了以后,通过add方法往队列里添加需要加载的对象
   loader.add("http://www.emptywhite.com/bulkloader-assets/cats.jpg");
   //添加加载对象时候,也可以给它添加一个id,方便以后调用
   loader.add("http://www.emptywhite.com/bulkloader-assets/shoes.jpg", {id:"bg"});
   //还可以通过priority属性调整加载对象的加载顺序,priority值越大,优先权越高,越早加载
   loader.add("http://www.emptywhite.com/bulkloader-assets/samplexml.xml", {priority:20, id:"config-xml"});
   //加载一个动画,加载动画的时候可以用pausedAtStart属性暂停播放动画
   loader.add("http://www.emptywhite.com/bulkloader-assets/movie.flv", {maxTries:6, id:"the-video", pausedAtStart:true});
   //maxTries属性用于设定加载失败时的重试次数,注意,这里的“id”用了字符串命名
   loader.add("http://www.emptywhite.com/bulkloader-assets/chopin.mp3", {"id":"soundtrack", maxTries:1, priority:100});
 
   //添加一个COMPLETE事件,这个事件会在队列里的所有对象都加载完毕后触发
   loader.addEventListener(BulkLoader.COMPLETE, onAllItemsLoaded);
 
   //添加一个PROGRESS事件,这个事件会在队列加载时不断触发。通常可以用于监听加载进度。
   loader.addEventListener(BulkLoader.PROGRESS, onAllItemsProgress);
 
   //队列编辑完毕后用star方法开始加载队列
   loader.start();
  }
  public function onAllItemsLoaded(evt : Event):void {
   trace("every thing is loaded!");
   //建立一个Video对象
   var video : Video = new Video();
   //从队列里提取刚才加载的视频流
   var theNetStream : NetStream = loader.getNetStream("the-video");
   addChild(video);
   video.attachNetStream(theNetStream);
   theNetStream.resume();
   video.y = 300;
   //提取图片
 
   //可以直接通过url提取对象
   var bitmapCats : Bitmap = loader.getBitmap("http://www.emptywhite.com/bulkloader-assets/cats.jpg");
   bitmapCats.width = 200;
   bitmapCats.scaleY = bitmapCats.scaleX;
   addChild(bitmapCats);
 
   //当然,也可以通过id提取对象
   var bitmapShoes : Bitmap = loader.getBitmap("bg");
   bitmapShoes.width = 200;
   bitmapShoes.scaleY = bitmapShoes.scaleX;
   bitmapShoes.x = 220;
   addChild(bitmapShoes);
 
   //提取音频
   var soundtrack : Sound = loader.getSound("soundtrack");
   soundtrack.play();
 
   //提取一个xml文档
   var theXML : XML = loader.getXML("config-xml");
   trace(theXML);
  }
  //通过BulkProgressEvent的loadingStatus方法可以显示加载过程中的所有信息!
  public function onAllItemsProgress(evt : BulkProgressEvent):void {
   trace(evt.loadingStatus());
  }
 }
}

 

=================================

 

 

BulkLoader 是个很好用的加载类库,用 BulkLoader实例的add()方法可以很方便地将素材地址加入加载列表。
当然,这里有一些地方要注意,我们一一的解决它。

在BulkLoader 的 add方法中,有下面这些参数:
url:* — 加载对象(String 或者 URLRequest 类型)
props:Object (default = null) — 一些加载对象的属性,有下面这些
preventCache:Boolean — 是否防止缓存
id:String — 添加加载对象时候,也可以给它添加一个id,方便以后调用
priority:int — 还可以通过priority属性调整加载对象的加载顺序,priority值越大,优先权越高,越早加载
maxTries:int — maxTries属性用于设定加载失败时的重试次数
weight:int — 每个文件的大小提前告诉BulkLoader(当你想更精确的得到加载进度的时候,这是一个好的办法)
headers:Array — URLRequest 的头信息,当你传入的url是一个String的时候,BulkLoader也会把这些信息添加到URLRequest里面
context:* — LoaderContext 或者 SoundLoaderContext,加载到ApplicationDomain程序域的时候常用的属性
pausedAtStart:Boolean — 如果是一个nestream 对象,控制对象是否暂停。

BulkLoader提供PROGRESS事件和COMPLETE事件,让我们监视加载状态,用法如下

1
2
3
4
5
6
7
8
//添加一个PROGRESS事件,这个事件会在队列加载时不断触发。通常可以用于监听加载进度。 
loader.addEventListener(BulkLoader.PROGRESS, onAllItemsProgress); 
 
//添加一个COMPLETE事件,这个事件会在队列里的所有对象都加载完毕后触发 
loader.addEventListener(BulkLoader.COMPLETE, onAllItemsLoaded); 
 
//一切准备好后,只要调用start方法就可以开始加载我们添加的素材序列了。
loader.start();

好了,看完上面的大家应该对BulkLoader有了一定了解了,至于一些用法,可以看BulkLoader的文档,或者搜索一下,有很多教程,这里我要说的是我们会遇到的一些问题。
用 BulkLoader实例的add()方法可以很方便地将素材地址加入加载列表
但是当素材太多的时候,加载进度会不准确(progess事件中的totalBytes并不能同步获取所有资源的Bytes)
最精确解决的办法是将 每个文件的大小提前告诉BulkLoader,就是在add里面加入weight值。
但是,这显然不是一个最省事的解决方法。
其实文档里面有一些属性可以给我们使用,通过BulkProgressEvent的loadingStatus方法可以显示加载过程中的所有信息!
大家可以在函数中trace() loadingStatus方法看看,就像下面:

1
2
3
public function onAllItemsProgress(e: BulkProgressEvent):void { 
     trace(e.loadingStatus()); 
}

你会发现 BulkProgressEvent 会有一个 weightPercent属性,通过这个值,差不多可以解决我们的问题了,如果发现加载进度还是有很大误差的话,大家再看看loadingStatus 里面的其他属性,通过自己的算法来解决,不然就只能在 add 的时候,把文件的大小提前告诉 BulkLoader了。

剩下一个会经常需要解决的问题就是程序域的问题了,也就是加载的时候ApplicationDomain的问题,大家都知道 在用 Loader 加载文件的时候,可以在通过LoaderContext开指定加载的域,如下(例子是加载到当前域):

1
2
3
var context:LoaderContext = new LoaderContext();
context.applicationDomain =   new ApplicationDomain(ApplicationDomain.currentDomain);
loader.load(new URLRequest("text.swf"),context);

在BulkLoader里面我们同样可以进行指定,方法也是差不多的。

1
2
3
4
5
6
var loader : BulkLoader = new BulkLoader("config");
loader.addEventListener(BulkLoader.PROGRESS, loadProgress);
loader.addEventListener(BulkLoader.COMPLETE, loadInit);
var context : LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
loader.add("EsCard.swf", {id:"main", context: context});
loader.start();

ok,这样就大功告成了。

希望这篇文章能帮到大家,如果有错误的地方,请指出,谢谢

---------------------------------

 

BulkLoader框架在一些需要加载很多swf文件,图片等使用很方便,不需要每次实例.具体见代码

package{ import flash.display.Sprite import flash.display.MovieClip import flash.events.* import flash.events.ProgressEvent import br.com.stimuli.loading.BulkLoader; import br.com.stimuli.loading.BulkProgressEvent; import br.com.stimuli.loading.loadingtypes.ImageItem; public class Main extends Sprite{ private var bulkLoader:BulkLoader private var container:Sprite public function Main():void{ container=new Sprite() bulkLoader=new BulkLoader("main loading") this.addChild(container) LoaderFun() } private function LoaderFun():void{ bulkLoader.add("a.swf") bulkLoader.add("b.swf") bulkLoader.addEventListener(BulkLoader.COMPLETE, onCompleteHandler); bulkLoader.addEventListener(BulkLoader.PROGRESS, onProgressHandler); bulkLoader.start(); } private function onCompleteHandler(evt:ProgressEvent):void{

var _a:MovieClip=bulkLoader.getMovieClip("a.swf")

 container.addChild(_a) //var _b:Class=ImageItem(bulkLoader.get("b.swf")).getDefinitionByName("Example_b") as Class //var _t:=new _b() var _MC:MovieClip = bulkLoader.getContent("a.swf"); var mc:Class = _MC.loaderInfo.applicationDomain.getDefinition("MC") as Class; var _mc:MovieClip =new mc() container.addChild(_mc); var _b:MovieClip = bulkLoader.getContent("b.swf"); var b:Class = _b.loaderInfo.applicationDomain.getDefinition("Example_b") as Class; container.addChild(new b() as MovieClip); //var _mc:MovieClip=new _MC() //container.addChild(_MC) //container.addChild(_a) //container.addChild(_t) } private function onProgressHandler(evt:ProgressEvent):void{ trace("Loaded" , evt.bytesLoaded," of ", evt.bytesTotal); } } }

红色部分主要是怎么取到库元件链接类的方法

 ========================

 

BulkLoader是一个不错且使用简单的开源加载类,其能实现对不同类型文件的加载进行管理。
在尝试加载多个文件时候只要使用 add + 文件地址,在加载结束后使用 “get文件类型”+文件地址或加载时候注册的id去获得要得到的文件。
下载地址: http://uh.9ria.com/link.php?url=http://code.google.com%2Fp%2Fbulk-loader%2F
官方:http://uh.9ria.com/link.php?url=http://www.stimuli.com.br%2Ftrane%2F2007%2Fnov%2F25%2Floading-reloaded%2F

package {
 import br.com.stimuli.loading.BulkLoader;
 import br.com.stimuli.loading.BulkProgressEvent;
 import flash.events.*;
 import flash.display.*;
 import flash.media.*;
 import flash.net.*;
 public class SimpleExampleMain extends MovieClip {
  public var loader:BulkLoader;
  public var v:Video;
  public var counter:int=0;
  public function SimpleExampleMain() {
   //构建BulkLoader的时候需要给它一个名称
   loader=new BulkLoader("main-site");
   //设置输出日志
   loader.logLevel=BulkLoader.LOG_INFO;
   //构建好了以后,通过add方法往队列里添加需要加载的对象
   loader.add("photo.png");
   //添加加载对象时候,也可以给它添加一个id,方便以后调用
   loader.add("images.jpg", {id:"bg"});
   //还可以通过priority属性调整加载对象的加载顺序,priority值越大,优先权越高,越早加载
   loader.add("list.xml", {priority:20, id:"config-xml"});
   //加载一个动画,加载动画的时候可以用pausedAtStart属性暂停播放动画
   loader.add("mov.fla", {maxTries:6, id:"the-video", pausedAtStart:true});
   //maxTries属性用于设定加载失败时的重试次数,注意,这里的“id”用了字符串命名
   loader.add("song.mp3", {"id":"soundtrack", maxTries:1, priority:100});

   //看了最新版本的文档,已经开始支持swf和json,一阵欣喜。
   //添加一个COMPLETE事件,这个事件会在队列里的所有对象都加载完毕后触发
   loader.addEventListener(BulkLoader.COMPLETE, onAllItemsLoaded);

   //添加一个PROGRESS事件,这个事件会在队列加载时不断触发。通常可以用于监听加载进度。
   loader.addEventListener(BulkLoader.PROGRESS, onAllItemsProgress);

   //队列编辑完毕后用star方法开始加载队列
   loader.start();
  }
  public function onAllItemsLoaded(evt : Event):void {
   trace("every thing is loaded!");
   //建立一个Video对象
   var video : Video = new Video();
   //从队列里提取刚才加载的视频流
   var theNetStream:NetStream=loader.getNetStream("the-video");
   addChild(video);
   video.attachNetStream(theNetStream);
   theNetStream.resume();
   video.y=300;
   
//提取图片

   //可以直接通过url提取对象
   var bitmapCats:Bitmap=loader.getBitmap("photo.png");
   bitmapCats.width=200;
   bitmapCats.scaleY=bitmapCats.scaleX;
   addChild(bitmapCats);

   //当然,也可以通过id提取对象
   var bitmapShoes:Bitmap=loader.getBitmap("bg");
   bitmapShoes.width=200;
   bitmapShoes.scaleY=bitmapShoes.scaleX;
   bitmapShoes.x=220;
   addChild(bitmapShoes);

   //提取音频
   var soundtrack:Sound=loader.getSound("soundtrack");
   soundtrack.play();

   //提取一个xml文档
   var theXML:XML=loader.getXML("config-xml");
   trace(theXML);
  }
  //通过BulkProgressEvent的loadingStatus方法可以显示加载过程中的所有信息!
  public function onAllItemsProgress(evt : BulkProgressEvent):void {
   trace(evt.loadingStatus());
  }
 }
}

侦听事件。比较厉害的是可以通过加载时候注册的id或文件地址来侦听想要侦听的文件。

// attaching events to all items: 
// this will fire once all items have been loaded
loader.addEventListener(BulkLoader.COMPLETE, onAllLoaded)
// this will fire on progress for any item 
// the event , BulkProgress is a subclass of ProgressEvent (with extra information)
loader.addEventListener(BulkLoader.PROGRESS, onAllProgress);
// this will fire if any item fails to load:
// the event is BulkErrorEvent and holds an array (errors) with all failed LoadingItem instances
loader.addEventListener(BulkLoader.ERROR, onAllError)
// you can also listen to events in individual items
// this will fire as soon as the item registred with the id of "bg" is done loading (even if there are other items to load)
loader.get("bg").addEventListener(Event.COMPLETE,onBackgroundLoaded)
// this will only trigged if the config.xml loading fails:
loader.get("list.xml").addEventListener(BulkLoader.ERROR, onXMLFailed);

获取文件方式:

var theBgBitmap : Bitmap = loader.getContent("bg") as Bitmap;
// you don't need to keep a reference to the loader intance, you can get it by name:
var theBgBitmap : Bitmap = BulkLoader.getLoader("main-site").getContent("bg") as Bitmap
// you can also use the conviniece methods to get a typed object:
var theBgBitmap : Bitmap = loader.getBitmap("bg");
// grab a BitmapData directly:
var theBgBitmap : Bitmap = loader.getBitmapData("bg");

BulkLoader的一些使用技巧

用 BulkLoader实例的add()方法可以很方便地将素材地址加入加载列表
但是当素材太多的时候,加载进度会不准确
解决的办法是将 每个文件的大小提前告诉BulkLoader
例如:dang.mp3 是1000KB
_loader.add("dang.mp3", { id:"dangSound", type:"sound",weight:1000 } );
防止缓存 preventCache:false


做一个负责加载和承载资源的全局单例 对加载的资源进行判断,已经加载的资源 就无需LOADING
没有加载的 就 新add() 这样做相当好
if (!_bulkLoader.hasItem(this._url)) {
  _bulkLoader.add(this._url, { type: BulkLoader.TYPE_MOVIECLIP } );
  _bulkLoader.start();
}else {
  _bulkLoader.reload(this._url);
}
trace(_bulkLoader.items.length);

 

------------------

 

想学习如果加载一张图片切成很多小图做成帧动画
帮你完美实现:

配置用的xml<?xml version="1.0" encoding="utf-8" ?>

<root>

        <folder name="s1">

                <image time="600" offsetX="0" offsetY="20">1.jpg</image>

                <image time="600" offsetX="50" offsetY="20">2.jpg</image>

                <image time="1200" offsetX="0" offsetY="0">3.jpg</image>

                <image time="600" offsetX="0" offsetY="0">4.jpg</image>

                <image time="600" offsetX="0" offsetY="0">5.jpg</image>

        </folder>

</root>
复制代码folder为目录名,图片的time为停留间隔时间(单位为毫秒),offsetX为x偏移,offsetY为y偏移
代码:package

{

        import flash.display.Bitmap;

        import flash.display.Sprite;

        import br.com.stimuli.loading.BulkLoader;

        import flash.events.Event;

        import flash.events.ProgressEvent;

        import flash.events.TimerEvent;

        import flash.utils.*;

        //import fl.controls.ProgressBar;

       

        /**

         * ...

         * @author janchie

         */

        public class Main extends Sprite

        {       

                private var _sp:Sprite = new Sprite();

                private var _config:XML;

                //private var _pb:ProgressBar = new ProgressBar();

               

               

                public function Main():void

                {

                        if (stage) init();

                        else addEventListener(Event.ADDED_TO_STAGE, init);

                }

               

                private function init(e:Event = null):void

                {

                        removeEventListener(Event.ADDED_TO_STAGE, init);

                        this.addChild(_sp);

                        var __loadXML:BulkLoader = new BulkLoader("main");

                        __loadXML.add("filelist.xml");

                        __loadXML.addEventListener(BulkLoader.COMPLETE, onLoadImages);

                        __loadXML.start();                       

                }

               

                private function onLoadImages(evt:Event):void {               

                        _config = BulkLoader.getLoader("main").getXML("filelist.xml");

                        var __loadImages:BulkLoader = new BulkLoader("images");

                        for each (var item:XML in _config.folder.image) {

                                __loadImages.add( _config.folder.@name + "/" + item, { id:"_p" + item.childIndex() } );

                        }

                        //__loadImages.addEventListener(BulkLoader.PROGRESS, onImagesProgress);

                        __loadImages.addEventListener(BulkLoader.COMPLETE, onShowImage);

                        __loadImages.start();

                }

               

                /*private function onImagesProgress(evt:ProgressEvent):void {

                        _pb.move(300, 250);

                        _pb.setSize(200,16);

                        _pb.setProgress(evt.bytesLoaded, evt.bytesTotal);

                        this.addChild(_pb);

                        //trace("load:" , evt.bytesLoaded," of ",  evt.bytesTotal);                       

                }*/

               

                private function onShowImage(evt:Event):void {

                        //this.removeChild(_pb);

                        var i:int = 0;

                        function toAddChlid():void {

                                var img:Bitmap, xmlImg:XMLList= _config.folder.image,

                                offsetX:Number = 0,

                                offsetY:Number = 0;

                               

                                if (_sp.numChildren > 0) _sp.removeChildAt(0);

                                if (i < xmlImg.length()) {

                                        img = BulkLoader.getLoader("images").getBitmap("_p" +i);

                                        offsetX = parseFloat(xmlImg[i].@offsetX);

                                        offsetY = parseFloat(xmlImg[i].@offsetY);

                                        img.x = offsetX;

                                        img.y = offsetY;

                                        _sp.addChild(img);

                                        setTimeout(toAddChlid, parseInt(xmlImg[i].@time));

                                        i++;

                                }else {

                                        i = 0;

                                        toAddChlid();

                                }                                       

                        }

                        toAddChlid();

                }       

               

        }

       

}
复制代码BulkLoader第三方库,可到code.google.com/p/bulk-loader/下载
flash ide即可编译

实现的关键地方为:
通过setTimeout,递归循环实现var i:int = 0;

function toAddChlid():void {

        var img:Bitmap, xmlImg:XMLList= _config.folder.image,

        offsetX:Number = 0,

        offsetY:Number = 0;

       

        if (_sp.numChildren > 0) _sp.removeChildAt(0);

        if (i < xmlImg.length()) {

                img = BulkLoader.getLoader("images").getBitmap("_p" +i);

                offsetX = parseFloat(xmlImg[i].@offsetX);

                offsetY = parseFloat(xmlImg[i].@offsetY);

                img.x = offsetX;

                img.y = offsetY;

                _sp.addChild(img);

                setTimeout(toAddChlid, parseInt(xmlImg[i].@time));

                i++;

        }else {

                i = 0;

                toAddChlid();

        }                                       

}

toAddChlid();