|
AS3復(fù)制可視對象
一,復(fù)制舞臺上的影片剪 方法1——反射方法: var ClassRef:Class = getDefinitionByName(getQualifiedClassName(t_mc)) as Class; var clone_mc:DisplayObject = new ClassRef(); addChild(clone_mc); 方法2——構(gòu)造器方法: var ClassRef:Class = t_mc.constructor; var clone_mc:MovieClip = new ClassRef(); addChild(clone_mc); 方法3——編譯器自動生成類方法: 此方法是方法1的變種,它比方法1更加簡單、粗暴、有效。下面我將為大家特別講解一下這個方法: 首先,在庫中創(chuàng)建一個影片剪輯,隨意繪制一個圖形,然后在第一幀上加上一個單行注釋符“//”; 接下來,將剛才創(chuàng)建的影片剪輯拖到舞臺上,創(chuàng)建一個示例,命名為“t_mc”; 現(xiàn)在,重點來了,我們在主時間線上寫下如下所示語句,然后按下Ctrl+Enter,仔細觀察一下輸出面板中輸出的信息。 trace(getQualifiedClassName(t_mc)); 你發(fā)現(xiàn),輸出結(jié)果是“_fla::Timeline_1 ”。出于對函數(shù)getQualifiedClassName的作用的清晰理解,你立刻就想到,這個Timeline_1應(yīng)該就是編譯器自動為我們的庫中的影片剪輯創(chuàng)建的類。我們貌似可以用這個類new出多個一樣的影片剪輯來哦!是不是這樣呢?我們來驗證一下: var clone_mc:DisplayObject = new Timeline_1(); addChild(clone_mc); Ctrl+Enter,你驚喜的發(fā)現(xiàn),我們成功了!實驗到這里,可能很多朋友已經(jīng)興奮地準(zhǔn)備去寫學(xué)習(xí)總結(jié)了。兄弟們,不要急,我們的實驗還沒完——現(xiàn)在,我們用同樣的方法,再次在庫中創(chuàng)建一個影片剪輯。然后也將它拖到舞臺上創(chuàng)建一個實例,取名為“d_mc”。接下來,我們將trace(getQualifiedClassName(t_mc)); 語句中的“t_mc”改成“d_mc”。測試一下影片,這次輸出的結(jié)果竟然是“flash.display::MovieClip”。 忽忽!傻了吧,不能用new MovieClip來復(fù)制“d_mc”了吧! 咋解決這個問題呢?我給大家一點點提示:試試將庫中那兩個影片剪輯各取一個響亮的名字(名稱),然后再看一下輸出的類名是什么。 使用以上方法復(fù)制影片剪輯時需要注意: 必須在庫中創(chuàng)建影片剪輯,并將庫中的影片剪輯拖到舞臺上創(chuàng)建了一個實例; 二,復(fù)制Loader加載的swf 復(fù)制外部加載的swf是一個相對高級的操作,步驟比較多,過程相對復(fù)雜,要闡述清楚原理細節(jié)需要很大篇幅的文字,因此,這里我就偷懶不詳細寫說明了,純用代碼來說明問題,希望對看得懂的朋友起到拋磚引玉的作用。 方法1——ByteArray深度復(fù)制 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以二進制數(shù)據(jù)格式加載到ByteArray中,然后用Loader類的loadBytes去加載URLLoader中的ByteArray。 方法2——ApplicationDomain 運行時動態(tài)類復(fù)制 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.以上兩種復(fù)制方法,由于都需要加載swf文件,因此需要文件級別的本地安全性; |
|
|