对于swc文件的动态加载

来源:互联网 发布:淘宝网中老年女上装 编辑:程序博客网 时间:2024/05/21 13:23

对于swc我们都知道他其实是一个压缩文件,解压以后分解为一个catalog.xml文件和一个library.swf文件

现在我们首先来讲解一下swf的加载:

使用的加载方式为:Loader,加载完成,使用loader.contentLoaderInfo.applicationDomain.getDefinition("Name")来获取在一个swf中的类。

也可以使用evt.target.applicationDomain.getDefinition("Name")来获取swf中的类。因为evt.target是loader.contentLoaderInfo,因为在添加监听的时候是这样子的。所以是这样的,然后使用var ClassName :* = evt.target.applicationDomain.getDefinition("Name");来得到Name这个类。后面就可以使用ClassName这个东西了,代表的是在swf中的类Name了。

这样的方法同时也适用于从swc解压出来的swf文件,在加载“library.swf”的时候,我们只要在最后的evt.target.applicationDomain.getDefinition("swf中的类")这样就可以获取swf(swc)中的类了。

上面的是一般的方法,即获取swf文件中的类的方法

下面来讲解一下如何从swc中获取相关的类。

分为两种情况来讲解:

(1)在你的工程中建立了一个flex库项目:无论你设置的库的“框架链接”是这两个任何的一项,好像都没有什么异同,随便怎么设置都可以,但是在你建立一个as3项目的时候,如果你设置是合并到代码中,那么在你的as3工程中是随便可以用的,你在flex库中的任何类。但是如果你设置的是外部,虽然你可以在as3工程中进行编辑,编译,也不会报错,因为你将flex库工程,加到了你的as3中去了,所以他认为可以找的到,但是在运行的时候,因为是外部的形式弄进来的,所有运行时会报错,说找不到某个类。

解决的方案有两种:[1]将as3项目中的引用类型该为合并到代码中[2]将swc加载到当前的swf中去,使用的方法是

private var m_fzip:FZip;

m_fzip = new FZip;
m_fzip.addEventListener(Event.COMPLETE, onFZipLoad);

m_fzip.load(new URLRequest(url));

private function onFZipLoad(e:Event):void
{

var f:ByteArray = m_fzip.getFileByName("library.swf").content;
var ldr:Loader = new Loader;
var lc:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain)
ldr.loadBytes(f, lc);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onLibLoad);
}

private function onLibLoad(evt :Event)

{


}

只要在这个swf中有swc中swf的加载就可以了,这样,只要你在这个as3项目中使用flex的类就可以了。这个过程详单于c++中的,将dll放到该程序的路径下一样。

(2)同样的你也可以采用动态加载swc的方法,这时候你不需要将as3添加flex库项目,你只是在上面代码中需要必要的修改

private function onLibLoad(evt :Event)

{

//在这个地方来调用要使用的类

evt.target.applicationDomain.getDefinition("Name");这样就可以了

}