1、AS3的強制類型轉換
我之前一直以為是沒有這個功能的,而最近在看一些文檔,發現這個功能是有的。目前總結下來有兩種寫法:
- 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在進過測試后,發現除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);
1 Bitmap swf加載進來SWF轉換成一個Bitmap
- private function complete(evt:Event):void
- {
- var loaderInfor:LoaderInfo=evt.currentTarget as LoaderInfo;
- if (loaderInfor != null)
- {
- var loader:Loader=loaderInfor.loader;
- if (loader != null && loader.content != null)
- {
- var bmpData:BitmapData=new BitmapData(loader.width,loader.height,true,0);
- bmpData.draw(loader,null,null,null,null,true);
- if(_roleIcons[loader.name].bitmapData)
- _roleIcons[loader.name].bitmapData.dispose();
- _roleIcons[loader.name].bitmapData=bmpData;
- _roleIcons[loader.name].width = obj.width;
- _roleIcons[loader.name].height = obj.height;
- delete _roleIcons[loader.name];
- }
- }
- beginLoadIcon();
- }
- //加載成功,發布成功事件
- private function completeFun(e:Event):void {
- data = loader.content["bitmapData"];
- delEvent();
- dispatchEvent(e);
- }
2 MovieClip 加載SWF里面的元素【MC、Bitmap】
- var equip:Class=_loader.contentLoaderInfo.applicationDomain.getDefinition("equipment") as Class;
- if(equip) {
- _equipIcons=new Bitmap(new equip(0,0));
- updateGoodsIcon(_notLoadEquip);
- _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,loadEquipComplete);
- _notLoadEquip = null;
- _loader.unload();
- next();
- }
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了。