有關AS3編程的一些總結
最近用AS3寫一些項目,在編程過程中,遇到不少問題,同時也有一些收穫和心得。現在貼出來希望對大家在AS3編程有一些協助。如果你發現有說得不對的地方,你可以指出來,大家一起來討論。
1、AS3的強制類型轉換
我之前一直以為是沒有這個功能的,而最近在看一些文檔,發現這個功能是有的。
目前總結下來有兩種寫法:
(1) var loader:URLLoader = URLLoader(event.target);
不知道這種寫法是借鑒那種程式設計語言,反正我沒有見過。
(補充這個文法說明:http://livedocs.adobe.com/flash/8_cn/main/00001211.html)
(2) var loader:URLLoader = event.target as URLLoader;
這種寫法是借鑒VB.Net程式設計語言,唉!AS3文法真得一個大雜燴。
2、URLStream和URLLoader
URLStream在文字檔資料方面可以支援多種字元編碼。
URLLoader在進過測試後,發現除UTF-8字元編碼外,其他字元編碼讀過來的資料都是亂碼。
(補,可通過ByteArray對象字元編碼轉換)
view plaincopy to clipboardprint?
- public class MoxieAS extends Sprite
- {
- public function MoxieAS ()
- {
- var loader:URLLoader = new URLLoader(new URLRequest("ttt.xml")); // <root><a>測試</a></root> encode by ANSI
- loader.dataFormat = URLLoaderDataFormat.BINARY;
- loader.addEventListener(Event.COMPLETE, complete);
- }
-
- private function complete (event:Event):void
- {
- var BA:ByteArray = new ByteArray;
- BA.writeBytes((event.target as URLLoader).data);
- BA.position = 0;
-
- var xml:XML = XML(BA.readMultiByte(BA.length, "GBK"));
-
- trace(xml.*); // output 測試
- }
- }
public<br />class MoxieAS extends Sprite<br/>{<br/> public function<br />MoxieAS ()<br/> {<br/> var loader:URLLoader = new<br />URLLoader(new URLRequest("ttt.xml")); //<br /><root><a>測試</a></root> encode by<br />ANSI<br/> loader.dataFormat =<br />URLLoaderDataFormat.BINARY;<br/><br />loader.addEventListener(Event.COMPLETE, complete);<br/><br />}<br/> <br/> private function complete<br />(event:Event):void<br/> {<br/> var BA:ByteArray = new<br />ByteArray;<br/> BA.writeBytes((event.target as<br />URLLoader).data);<br/> BA.position = 0;<br/> <br/><br />var xml:XML = XML(BA.readMultiByte(BA.length, "GBK"));<br/><br /><br/> trace(xml.*); // output 測試<br/> }<br/>}
感謝abc12hjc提供補充代碼
具體用那個方式就看實際功能需求了。
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過程發現,如果把swf檔案放到html頁面後,stage.stageWidth和stage.stageHeight在第一次載入調用時,他們的值為空白值;
7、 AVM1Movie
如果是AVM1Movie 對象時,就不能直接調用stop,play,gotoAndStop等原來MovieClip對象的功能了,而且不能將AVM1Movie 對象轉換成MovieClip對象。目前解決辦法:一種是用flash cs3 重建 flash 9的swf檔案;另一種是國外網站有說能AVM1和AVM2兩個虛擬機器相互調用的方式(貼一個地址);
8、mask
在使用遮罩功能,發現一個問題,如果不把用於遮罩的顯示元件通過addChild方法添加到同一級的顯示容器裡的話,遮罩效果就顯示不正常,不知道這個是不是一個bug。我差點因為這個問題而放棄AS3改用AS2了。