ActionScript3.0複製可視對象的多種方法

來源:互聯網
上載者:User

一、複製舞台上的影片剪

方法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程式員可以去研究一下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.