原文:http://www.klstudio.com/post/125.html
最近用AS3 寫一些項目,在編程過程中,遇到不少問題,同時也有一些收獲和心得,F在貼出來希望對大家在AS3 編程有一些幫助。如果你發(fā)現有說得不對的地方,你可以指出來,大家一起來討論。
1.AS3的強制類型轉換
我之前一直以為是沒有這個功能的,而最近在看一些文檔,發(fā)現這個功能是有的。目前總結下來有兩種寫法:
第一種:var loader:URLLoader = URLLoader(event.target); 不知道這種寫法是借鑒那種編程語言,反正我沒有見過。補充這個語法說明: http://livedocs.adobe.com/flash/8_cn/main/00001211.html
第二種:var loader:URLLoader = event.target as URLLoader; 這種寫法是借鑒VB.Net 編程語言,唉!AS3 語法真的是一個大雜燴。
2.URLStream 和URLLoader
URLStream 在文本文件數據方面可以支持多種字符編碼。URLLoader 在進過測試后,發(fā)現除UTF-8字符編碼外,其他字符編碼讀過來的數據都是亂碼。
可通過ByteArray 對象字符編碼轉換(感謝abc12hjc 提供補充代碼):
public class MoxieAS extends Sprite { public function MoxieAS () { var stream:URLStream = new URLStream; stream.addEventListener(Event.COMPLETE, complete); stream.load(new URLRequest("ttt.xml")); // <root><a /><b /><c /></root> } private function complete (event:Event):void { var stream:URLStream = event.target as URLStream; var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable)); trace(xml.*.length()); // output 3 } }
具體用那個方式就看實際功能需求了。
3.URLRequest
URLStream、URLLoader、Loader 等讀取外部數據的類,里面的load 方法參數值是URLRequest 對象。我在編程過程總是喜歡直接寫地址字符串,原來習慣改過來看樣子要花點時間了。
4.Loader
在使用Loader 來加載數據,添加偵聽事件時,注意一定要給Loader 的 contentLoaderInfo 屬性增加事件,而不是給Loader 對象增加事件。我就是因為加錯對象(關鍵是編譯時還沒有報錯),郁悶得差點要把電腦給扔了。
錯誤寫法: var loader:Loader = new Loader(); loader.addEventListener(Event.COMPLETE, completeHandler); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
正確寫法: var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
5.Loader加載過來的數據類型
大家知道Loader 是用來代替原來MovieClip 的loadMovie 功能,用于加載外部的圖片文件,SWF文件。
- 如果加載圖片文件(jpg,gif,png等)時,Loader.content 得到數據類型是Bitmap 對象;
- 如果加載SWF文件(flash 9 版本)時,Loader.content 得到數據類型是MovieClip 對象;
- 如果加載SWF文件(flash 9 以前版本) 時, Loader.content 得到數據類型是AVM1Movie 對象;
6.stage
在調試flash 過程發(fā)現,如果把swf文件放到html 頁面后,stage.stageWidth 和stage.stageHeight 在第一次加載調用時,他們的值為空值;
7. AVM1Movie
如果是AVM1Movie 對象時,就不能直接調用stop,play,gotoAndStop 等原來MovieClip 對象的功能了,而且不能將AVM1Movie 對象轉換成MovieClip 對象。目前解決辦法:一種是用flash cs3 重新生成 flash 9 的swf 文件;另一種是國外網站有說能AVM1 和AVM2 兩個虛擬機相互調用的方式(貼一個地址);
8.mask
在使用遮罩功能,發(fā)現一個問題,如果不把用于遮罩的顯示元件通過addChild 方法添加到同一級的顯示容器里的話,遮罩效果就顯示不正常,不知道這個是不是一個bug。我差點因為這個問題而放棄AS3 改用AS2 了。
經典論壇討論: http://bbs.blueidea.com/thread-2756572-1-1.html
本文鏈接:http://www.95time.cn/tech/multimedia/2007/4774.asp
出處:藍色理想
責任編輯:moby
◎進入論壇Flash專欄版塊參加討論
|