每天学一点flash(61) flash加载多个xml设计
要想知道flash加载一个xml,是一件很简单的事情,只有使用URLLoader就能够实现加载。目前在网上流行很多种加载的方式,有多种开源的项目。可以方便处理加载外部的资源,进行管理。只是用这样强大的功能的工具,固然带来方便和效率,不过当没有那些类的时候,我们怎样办呢?还是最好动手尝试写一个,尽管功能不强大,但是至少我们可以不受限制这些工具类库。这样对我们发展也会好。
现在我们来写一个加载多个xml的制作。
制作的方法:
public class XMLManager extends EventDispatcher
继承EventDispatcher事件分派类
public function add(path:String,id:String):void;//添加xml文件
public function start():void;//开始加载
public function getXML(id:String):XML;//返回xml文件
这种组合方式,是借鉴这些加载开源的类库。
类继承事件分派
添加文件
开始加载
借用关联数组Dictionary的作用实现存放对象。
一些技巧:
- class Item
- {
- public var loader:URLLoader;
- public var path:String;
- public function Item(loader:URLLoader,path:String)
- {
- this.loader=loader;
- this.path=path;
- }
- }
这个类当中,可以记录一些数据。这种设计可以称为类结构体,就像c++结构体一样。这种类方便存储数据。
关联数组的使用:
- public function add(path:String,id:String):void
- {
- var loader:URLLoader=new URLLoader();
- m_data[id]=new Item(loader,path);
- num++;
- }
这样就能够像数组一样保存一个对象了,方便管理。
代码清单:
- package
- {
- import flash.events.*;
- import flash.net.*;
- import flash.utils.Dictionary;
- public class XMLManager extends EventDispatcher
- {
- private var m_data:Dictionary=new Dictionary(true);
- private var num:int=0;
- public function XMLManager()
- {
- }
- //添加文件
- public function add(path:String,id:String):void
- {
- var loader:URLLoader=new URLLoader();
- m_data[id]=new Item(loader,path);
- num++;
- }
- //开始加载
- public function start():void
- {
- for (var i:String in m_data)
- {
- m_data[i].loader.load(new URLRequest(m_data[i].path));
- m_data[i].loader.addEventListener(Event.COMPLETE,completeHandler);
- m_data[i].loader.addEventListener(IOErrorEvent.IO_ERROR,ErrorHandler);
- m_data[i].loader.addEventListener(ProgressEvent.PROGRESS,ProgressHandler);
- }
- }
- //返回加载的时候的xml数据
- public function getXML(id:String):XML
- {
- var xml:XML=XML(m_data[id].loader.data);
- return xml;
- }
- //完成处理
- private function completeHandler(event:Event):void
- {
- event.currentTarget.removeEventListener(Event.COMPLETE,completeHandler);
- num--;
- if (num==0)
- {
- this.dispatchEvent(new Event("loadComplete"));
- }
- }
- //错误处理
- private function ErrorHandler(event:IOErrorEvent):void
- {
- this.dispatchEvent(new Event("loadError"));
- }
- //进度
- private function ProgressHandler(event:ProgressEvent):void
- {
- this.dispatchEvent(new Event("loadProgress"));
- }
- }
- }
- import flash.net.URLLoader;
- class Item
- {
- public var loader:URLLoader;
- public var path:String;
- public function Item(loader:URLLoader,path:String)
- {
- this.loader=loader;
- this.path=path;
- }
- }
测试一下自己的类结果:
- var xml:XMLManager=new XMLManager();
- xml.add("1.XML","id1");
- xml.add("2.XML","id2");
- xml.add("3.XML","id3");
- xml.start();
- xml.addEventListener("loadComplete",completeHandler);
- function completeHandler(event:Event):void
- {
- trace(xml.getXML("id1"));
- trace(xml.getXML("id2"));
- trace(xml.getXML("id3"));
- }
拓展:
通过这种方式,我们已经实现到加载的目的,对没有太多要求的,这种加载多个xml的设计基本已经实现到。现在我们想一想
如果我们加载多个mp3,那么我们应该怎样设计?同理,我们可以借鉴这种加载的方式,通过设计可以完成这样的功能类。结合这些,就能实现更大强大的加载管理类。就像开源项目当中BulkLoader类和QueueLoader类一样。一点点实现。

浙公网安备 33010602011771号