如何為動態(tài)創(chuàng)建的MovieClip指定鼠標事件
1. 正常情況下,可以直接通過設置事件處理器指定事件,下面是一個例子
imageMc = mainContainer.createEmptyMovieClip("imageMc",1); with (imageMc) { moveTo(0,0); lineStyle(1,0xffff00); beginFill(0x00ff00,60); lineTo(400,0); lineTo(400,100); lineTo(0,100); } imageMc.onRelease = function(){ trace("aaa"); }
2. 如果這個MovieClip創(chuàng)建以后,執(zhí)行了LoadMovie操作,比如,加載了一個圖片,上面的方法就無效了。 (注:用其他通用的事件處理器綁定方法,也會無效的,在經(jīng)過n次的失敗后和一番調查后,終于在flash的幫助里發(fā)現(xiàn)了一條信息)
“將事件處理函數(shù)和 loadMovie(MovieClip.loadMovie 方法)一起使用,其結果是無法預知的。如果使用 on() 將事件處理函數(shù)附加到按鈕,或是使用諸如 onPress(MovieClip.onPress 處理函數(shù))的事件處理函數(shù)方法創(chuàng)建動態(tài)處理函數(shù),然后調用 loadMovie(),則在加載新內容之后,事件處理函數(shù)將不再可用。然而,如果使用 onClipEvent 處理函數(shù)或 on 處理函數(shù)將事件處理函數(shù)附加到影片剪輯,然后對該影片剪輯調用 loadMovie(),則在加載新內容之后,事件處理函數(shù)將仍然可用。”
真是無語了。Flash官方一面鼓勵開發(fā)者,不要將代碼寫到對象里,應該寫到外部ActionScript文件里?墒,onClipEvent()和 on()就是典型的將代碼寫到對象里,在Flash的另一頁幫助里,很清楚的抵制這種寫法。那么如果,在純.as文件里,還有辦法給LoadMovie以后的MovieClip添加事件么。
又經(jīng)過一番調查,終于發(fā)現(xiàn)可以用以下方法解決,既可以解決這個問題,解決方式也比較優(yōu)雅,就是借助MovieClipLoader.
imageMc = mainContainer.createEmptyMovieClip("imageMc",1); //imageMc.loadMovie("E:\\1.jpg"); //不能用這種方法 var loader:MovieClipLoader = new MovieClipLoader(); loader.loadClip("E:\\1.jpg", imageMc); var mclListener:Object = new Object(); mclListener.onLoadInit = function(evt:MovieClip) { evt.onPress = function() { trace("bbb"); } } loader.addListener(mclListener);
在mclListener的evt對象里,設置onPress事件。問題解決!
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2660739-1-2.html
出處:藍色理想
責任編輯:moby
◎進入論壇Flash專欄版塊參加討論
|