前两天有人问如何加载多个swf并使用其中的类我推荐bulkloader,今天又在网上看到一个帖子:有人还下载了源代码并修改了其中的LoadingItem.as和ImageItem.as以此来获得类实例?说“使用BulkLoader统一管理资源载入时,发现BulkLoader类并没有获到swf应用程序域的相关方法”我觉得很奇怪不应这样呀所以下了源码看了看,结果真的有不需要额外修改,或许是作者后来修改的但确实提供了该方法。简单介绍一下用法我是在flex中实现的
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo" creationComplete="init()">
<fx:Style source="default.css"/>
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import br.com.stimuli.loading.BulkLoader;
import br.com.stimuli.loading.BulkProgressEvent;
import br.com.stimuli.loading.loadingtypes.ImageItem;
import flash.events.Event;
import mx.core.UIComponent;
private var bulkloader:BulkLoader = new BulkLoader("mainLoading");
public function init():void{
//获得监听没啥好说的
bulkloader.addEventListener(BulkLoader.COMPLETE, onCompleteHandler);
bulkloader.addEventListener(BulkLoader.PROGRESS, onProgressHandler);
//加载你要导入的swf
bulkloader.add("Main.swf");
bulkloader.start();
}
public function onCompleteHandler(event:Event):void{
//用get方法获得获得实例,用强制类型转换获得imageitems对象实例(该实例下有getDefinitionByName)Rect是我声明的类名
var t:Class = ImageItem(bulkloader.get("Main.swf")).getDefinitionByName("Rect") as Class
if (t == null) {
trace(t is null);
}else{
var tt:Sprite = new t;
}
var c:UIComponent = new UIComponent;
c.addChild(tt);
this.addElement(c);
}
public function onProgressHandler(event:BulkProgressEvent):void{
trace("Loaded" , event.bytesLoaded," of ", event.bytesTotal);
}
]]>
</fx:Script>
</s:WindowedApplication>
为啥不把getDefinitionByName定义成loaditem父类方法呢?毕竟加载图像,xml,video是不需要的,所以没有添加在父类里面(个人意见)
你也可以修改loaditem把它透出来就这样不需要强制类型转换了。在loaditem中添加方法
public function getDefinitionByName(className : String) : Object{
return null;
}
在imageitem getDefinitionByName方法前面添加override就可以了
就可以直接var t:Class = bulkloader.get("Main.swf").getDefinitionByName("Rect") as Class