[转]ActionScript3.0复制可视对象的多种方法
一、复制舞台上的影片剪
方法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.constructor; var clone_mc:MovieClip = new ClassRef(); addChild(clone_mc); |
方法3——编译器自动生成类方法:
此方法是方法1的变种,它比方法1更加简单、粗暴、有效。下面我将为大家特别讲解一下这个方法:首先,在库中创建一个影片剪辑,随意绘制一个图形,然后在第一帧上加上一个单行注释符“//”;
接下来,将刚才创建的影片剪辑拖到舞台上,创建一个示例,命名为“t_mc”;
现在,重点来了,我们在主时间线上写下如下所示语句,然后按下Ctrl+Enter,仔细观察一下输出面板中输出的信息。
trace (getQualifiedClassName(t_mc)); |
你发现,输出结果是“_fla::Timeline_1 ”。出于对函数getQualifiedClassName的作用的清晰理解,你立刻就想到,这个Timeline_1应该就是编译器自动为我们的库中的影片剪辑创建的类。我们貌似可以用这个类new出多个一样的影片剪辑来哦!是不是这样呢?我们来验证一下:
var clone_mc:DisplayObject = new Timeline_1(); addChild(clone_mc); |
二、复制Loader加载的swf
复制外部加载的swf是一个相对高级的操作,步骤比较多,过程相对复杂,要阐述清楚原理细节需要很大篇幅的文字,因此,这里我就偷懒不详细写说明了,纯用代码来说明问题,希望对看得懂的朋友起到抛砖引玉的作用。
方法1——ByteArray深度复制
var byteLoader:URLLoader = new URLLoader(); byteLoader.dataFormat = URLLoaderDataFormat.BINARY; byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler); byteLoader.load( new URLRequest( "t.swf" )); 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); } 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程序员可以去研究一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?