一、複製舞台上的影片剪
方法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程式員可以去研究一下。