AS3复制可视对象
一,复制舞台上的影片剪
方法1——反射方法:
var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class;
var clone_mc:DisplayObject = new ClassRef();
addChild(clone_mc);
方法2——构造器方法:
var ClassRef:Class = t_mc.prototype.constructor;
var clone_mc:MovieClip = new ClassRef();
addChild(clone_mc);
二,复制Loader加载的swf
复制外部加载的swf是一个相对高级的操作,步骤比较多,过程相对复杂,要阐述清楚原理细节需要很大篇幅的文字,因此,这里我就偷懒不详细写说明了,纯用代码来说明问题,希望对看得懂的朋友起到抛砖引玉的作用。
方法1——ByteArray深度复制
var byteLoader:URLLoader = new URLLoader();
byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
var loader:Loader = new Loader();
loader.y = 200;
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
function loadInitHandler(evt:Event):void
{
var cloneLoder:Loader = new Loader();
addChild(cloneLoder);
cloneLoder.loadBytes(byteLoader.data);
}
byteLoader.load(new URLRequest("t.swf"));
function loadCompleteHandler(evt:Event):void
{
loader.loadBytes(byteLoader.data);
}
简单原理:用URLLoader将外部的swf以二进制数据格式加载到ByteArray中,然后用Loader类的loadBytes去加载URLLoader中的ByteArray。
方法2——ApplicationDomain 运行时动态类复制
var loader:Loader = new Loader();
loader.y = 200;
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
var context:LoaderContext = new LoaderContext();
context.applicationDomain=ApplicationDomain.currentDomain;
loader.load(new URLRequest("t.swf"), context);
function loadInitHandler(evt:Event):void
{
var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;
var clone_mc: MovieClip = new ClassRef();
addChild(clone_mc);
}
注意:
1.以上两种复制方法,由于都需要加载swf文件,因此需要文件级别的本地安全性;
2.使用第二种方法(ApplicationDomain)时,生成“t.swf”时必须为舞台添加文档类属性。添加的文档类可以是具体的外部as类,也可以仅仅是一个名字。上例中我添加的文档名为”TestClass”, getDefinition("TestClass")中填的参数内容应该跟要复制的swf的文档类名相同。
3. ApplicationDomain还有更多高级用法,有兴趣的高级AS程序员可以去研究一下。
一,复制舞台上的影片剪
方法1——反射方法:
var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class;
var clone_mc:DisplayObject = new ClassRef();
addChild(clone_mc);
方法2——构造器方法:
var ClassRef:Class = t_mc.prototype.constructor;
var clone_mc:MovieClip = new ClassRef();
addChild(clone_mc);
二,复制Loader加载的swf
复制外部加载的swf是一个相对高级的操作,步骤比较多,过程相对复杂,要阐述清楚原理细节需要很大篇幅的文字,因此,这里我就偷懒不详细写说明了,纯用代码来说明问题,希望对看得懂的朋友起到抛砖引玉的作用。
方法1——ByteArray深度复制
var byteLoader:URLLoader = new URLLoader();
byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
var loader:Loader = new Loader();
loader.y = 200;
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
function loadInitHandler(evt:Event):void
{
var cloneLoder:Loader = new Loader();
addChild(cloneLoder);
cloneLoder.loadBytes(byteLoader.data);
}
byteLoader.load(new URLRequest("t.swf"));
function loadCompleteHandler(evt:Event):void
{
loader.loadBytes(byteLoader.data);
}
简单原理:用URLLoader将外部的swf以二进制数据格式加载到ByteArray中,然后用Loader类的loadBytes去加载URLLoader中的ByteArray。
方法2——ApplicationDomain 运行时动态类复制
var loader:Loader = new Loader();
loader.y = 200;
addChild(loader);
loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
var context:LoaderContext = new LoaderContext();
context.applicationDomain=ApplicationDomain.currentDomain;
loader.load(new URLRequest("t.swf"), context);
function loadInitHandler(evt:Event):void
{
var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;
var clone_mc: MovieClip = new ClassRef();
addChild(clone_mc);
}
注意:
1.以上两种复制方法,由于都需要加载swf文件,因此需要文件级别的本地安全性;
2.使用第二种方法(ApplicationDomain)时,生成“t.swf”时必须为舞台添加文档类属性。添加的文档类可以是具体的外部as类,也可以仅仅是一个名字。上例中我添加的文档名为”TestClass”, getDefinition("TestClass")中填的参数内容应该跟要复制的swf的文档类名相同。
3. ApplicationDomain还有更多高级用法,有兴趣的高级AS程序员可以去研究一下。