一,複製舞台上的影片剪
方法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);
Ctrl+Enter,你驚喜的發現,我們成功了!實驗到這裡,可能很多朋友已經興奮地準備去寫學習總結了。兄弟們,不要急,我們的實驗還沒完——現在,我們用同樣的方法,再次在庫中創建一個影片剪輯。然後也將它拖到舞台上創建一個實例,取名為“d_mc”。接下來,我們將trace(getQualifiedClassName(t_mc)); 語句中的“t_mc”改成“d_mc”。測試一下影片,這次輸出的結果竟然是“flash.display::MovieClip”。
忽忽!傻了吧,不能用new MovieClip來複製“d_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程序員可以去研究一下。
出處:http://hi.baidu.com/javabbs/blog/item/dcb9a1456269182dcefca32d.html
沒有留言:
張貼留言