对于FLASH,我们可以把任何的可视化元件都看成某个类文件的具体实例,包括swf文件。
我们可以把swf文件看成一个类的具体实例,而它里面拥有个个其他类的实例对象,例如:
我们新建一个loaded.fla文件,然后我们建立一个影片剪辑元件,你可以在它的内部做一些动画处理,打开库,单击元件右建,选择“链接”打开“链接属性”,在类的输入框里我们键入“MyClass”
这样一来我们就可以把这个元件作为一个类--MyClass。也就是说我们可以通过new来构建这个元件的具体实例并显示在舞台,如:
var test:MyClass=new MyClass(); addChild(test);
然而ApplicationDomain类能够获得swf文件的应用程序域,通过getDefinition方法可以从指定的应用程序域获取一个公共定义。 该定义可以是一个类、一个命名空间或一个函数的定义,但是,访问被加载的swf中的属性和方法就不需要ApplicationDomain类,直接访问即可。代码如下
package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.MovieClip; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; import flash.system.ApplicationDomain; /** *@author hypo.chen *@E-mail 645338868@qq.com *@data 2015-9-10 */ [SWF(width="1024",height="768",frameRate="60")] public class GetAppDomain extends Sprite { private var _lrd:Loader; private var _urlR:URLRequest; public function GetAppDomain() { init(); } private function init():void { _urlR = new URLRequest("loaded.swf"); _lrd = new Loader(); _lrd.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaded); _lrd.load(_urlR); } private function onLoaded(e:Event):void { //直接访问被加载的swf中的属性和方法,但是定义的属性和方法必须是public e.target.content.testFun(); trace(e.target.content.testVar); //LoaderInfo对象承载载入swf文件的信息 var swfTarget:LoaderInfo = e.target as LoaderInfo; var appDomain:ApplicationDomain = swfTarget.applicationDomain as ApplicationDomain; //访问被加载的swf库中链接的类 var mcClass:Class = appDomain.getDefinition("MyClass") as Class; var mcA:MovieClip = (new mcClass()) as MovieClip; var mcB:MovieClip = (new mcClass()) as MovieClip; this.addChild(mcA); mcA.x = 100; mcA.y = 100; mcA.alpha = .5; this.addChild(mcB); mcB.x = 400; mcB.y = 100; //访问被加载的swf库中的文档类 var _test:Class = appDomain.getDefinition("Test") as Class; } } }
loaded.fla文档类代码如下:
package { import flash.display.MovieClip; public class Test extends MovieClip { public var testVar:String = "testVar"; public function Test () { // constructor code trace("test") } public function testFun():void { trace("testFun"); } } }