搜尋部落格文章

2011年12月20日 星期二

Loader,URLLoader,URLStream 比較

(1)Loader
Loader,用於加載外部的圖片和SWF文件。
如果加載圖片文件(jpg,gif,png等)時,Loader.content得到數據類型是Bitmap對象;
如果加載SWF文件(flash 9版本)時,Loader.content得到數據類型是MovieClip對象;
如果加載SWF文件(flash 9以前版本)時, Loader.content得到數據類型是AVM1Movie對象;

(2)URLLoader
以文本、二進制數據或URL編碼變量的形式從URL下載數據。在下載文本文件、XML或其它用於動態數據驅動應用程序的信息時,它很有用。 URLLoader對象會先從URL中下載所有數據,然後才將數據用於ActionScript。它會發出有關下載進度的通知,通過bytesLoaded和bytesTotal屬性以及已調度的事件,可以監視下載進度。 在加載非常大的視頻文件(如FLV的視頻文件)時,可能會出現內存不足錯誤。

(3)URLStream
提供對下載URL的低級訪問。數據一下載,便可隨即為應用程序使用,這和使用URLLoader時需要等到整個文件下載完不同。並且URLStream類還允許在完成下載前關閉流。已下載文件的內容將作為原始二進制數據提供。在URLStream中的讀取操作是非阻塞模式的。這意味著您在讀取數據之前必須使用bytesAvailable屬性來確定是否能夠獲得足夠的數據。如果不能獲得足夠的數據,將引發EOFError異常。 在默認情況下,所有二進制數據都是以Big-endian格式編碼的,並且最高位字節於第一位。

下面一個實例將被加載的配置文件以二進制數據讀取,這可以解決很多問題,比如對不同格式配置文件進行的處理


package {
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.net.URLRequest;
 import flash.net.URLStream;
 import flash.net.URLLoader;
 import flash.utils.ByteArray;
 import flash.net.URLLoaderDataFormat;
 
 public class Test extends Sprite {
  public function Test(){
   //testURLLoader();   
   testURLStream();
  }
  
  private function testURLLoader():void {
   var urlLoader:URLLoader = new URLLoader();
   urlLoader.dataFormat = URLLoaderDataFormat.BINARY; //原始二进制数据   
   urlLoader.addEventListener(Event.COMPLETE, completeHandler);
   urlLoader.load(new URLRequest("02.xml:"));
  }
  
  private function completeHandler(event:Event):void {
   trace("配置文件是ANSI :" + event.target.data); // 如果配置文件是ANSI等,会出现中文字乱码   
   //URLLoader如果遇到乱码,则可以转换(利用标准的xml格式Excle可以解决乱码问题就是基于这里):   
   var _byteArray:ByteArray = new ByteArray;
   _byteArray.writeBytes(event.target.data);
   _byteArray.position = 0;
   //如果是xml文档   
   var xml:XML = XML(_byteArray.readMultiByte(_byteArray.length, "chinese")); //简体中文 (GB2312)   
   trace(xml);
  }
  
  private function testURLStream():void {
   var stream:URLStream = new URLStream();
   stream.addEventListener(Event.COMPLETE, complete);
   stream.load(new URLRequest("02.xml"));
  }
  
  private function complete(event:Event):void {
   var stream:URLStream = event.target as URLStream;
   var xml:XML = XML(stream.readMultiByte(stream.bytesAvailable, "chinese")); //简体中文 (GB2312)   
   trace(xml);
  }
 }
}

偵測瀏覽器FlashPlayer版本

檢查FlashPlayer版本及是否為debug版

http://flashbuilder.eu/flash-player-version.html
http://www.flashplayerversion.com/

2011年12月19日 星期一

Loader類別的 IO_ERROR 事件中,如何取得url?

因專案需求要對載入物件做加載備用路徑的功能
本來想說用讓Loader.contentLoaderInfo監聽IO_ERROR事件
假設觸發IO_ERROR事件,從事件裡去獲得原始路徑,然後利用string拆解

然後呢!

誰知道
IO_ERROR事件中,居然沒辦法獲取這樣子的屬性
唯一可以取得原始路徑的就在Event.COMPLETE
但在IO_ERROR的錯誤訊息中卻又有原始路徑 囧
這一點實在是很怪異

理論上在初始載入時,應該就會知道載入路徑才是
猜想...可能是Loader內部結構的關係

幾種解決方法

(1) 拆解錯誤訊息
優: 不用自己另寫變數存取
缺: 假設往後錯誤訊息拆解的規則變了,也就失效了
private function ioError(e:IOErrorEvent):void {
  trace(e.text.split(":")[3]);
}
(2) 以url替loader取名字
優: 簡單快速的寫法
缺: 若loader.name另有用途,就不太適用

(3) 寫一個類別繼承Loader
優: 靈活性高
缺: 還沒想到(類別概念要有一定基礎)
複寫Loader.load()

2011年12月14日 星期三

Maxthon 3 update lastest Flash Player

@ 到Adobe官網下載並安裝最新版本的 Adobe Flash Player

一般版: http://get.adobe.com/flashplayer/
Debug版: http://www.adobe.com/support/flashplayer/downloads.html

@ 删除Maxthon3安裝目錄下 \Core\Webkit\Npplugins下的NPSWF32.dll

或者

複製 Windows 7的 C:\WINDOWS\Syswow64\Macromed\FLASH 下的 NPSWF32.dll
或者 Windows XP的 C:\WINDOWS\system32\Macromed\Flash

取代 Maxthon3 安裝目錄下 \ Core \ Webkit的 \ Npplugins 下的 NPSWF32.dll 文件 。

2011年11月28日 星期一

正則表達式 正規表達式

1、正則表達式的概念
正則表達式是用來描述字符串特徵的標準方式。
正則表達式由兩個部分組成:一部分由雙斜杠來標示字符串起始位置,這部分叫匹配模式,用來描述字符串特徵的;另一部分是在第二個斜杠後面的字母,叫做正則表達式的標誌位,是gimsx這五個字母的組合。
例如:var zfc: RegExp=/hello/g;
正則表達式還可以使用正則表達式類的構造函數來生成一個正則表達式實例。
例如:var zfc: RegExp=new RegExp(“hello”,”g”);
可以看出正則表達式的構造函數只不過是將匹配模式和標誌位分開成兩個字符串,當成參數,來生成正則表達式的實例。標誌位是可選參數,如果有為空或者不屬於”gimsx”的字母出現,那麼標誌位參數將被忽略。
使用構造函數生成正則表達式實例,要注意由於匹配模式作為String型,要注意相關的字符轉義,比如單引號和雙引號。


2、正則表達式的引擎機制
AS3使用功能強大的NFA引擎,NFA引擎是一種Greedy的執行方式,一旦找到匹配立刻返回,不管後面是否還有匹配的字符,最先返回最左邊的匹配。


3、正則表達式語法
①正則表達式中的文字符號
由文字符號組成的正則表達式是最簡單的類型,文字符號包括字母、符號和單詞。中文也屬於文字符號,它是用Unicode碼表示的。
文字符號分為3種,即普通文字和符號、元字符和不可見字符。但是,如果使用正則表達式構造函數來匹配正斜杠的話,就不需要轉義了,但不可見字符還是需要轉義的。

②正則表達式中的字符集
字符集是指由中括號裡定義的字符集合。字符集中的字符只要有一個符合特徵描述,那麼就會被認為匹配。字符集只能匹配一個字符。
在字符集中我們可以使用連字符“ - ”來定義一個範圍。3個常用的字符集[AZ]、[az]、[0-9]
取反符號(^)在字符集中的作用是對方括號裡面的字符集取反。即使用了取反符號,只要是不符合字符集描述的字符就符合匹配。
字符集中需要轉義的特殊字符。我們只需對正則表達式字符集元字符中的“ [\^- ”進行轉義。

③特殊的點號(.)
正則表達式中用“.”號來表示任何字符。但“.”號不匹配換行符(\n)。AS3提供一個單行模式標誌符(s)來讓“.”號匹配換行符。

④選擇符(|)
選擇符“|”表示選擇,用來匹配多個可能的正則表達式中的一個。

⑤括號與分組
用圓括號將表達式的一部分括起來,就會將這部分錶達式定義成組。組將被當成一個整體來進行操作。這樣的操作,被稱為分組。
分組一般有如下應用:
● 用來限定選擇符的作用範圍。
● 可以指定括號中的內容重複次數。

⑥用正則表達式描述字符串的重複
顯式限定符是使用花括號{}及其中的數字值表示模式出現次數的上下限的方式。除了顯式限定符,還有非顯式限定符。
如果限定符前面是跟著字符集,那麼就限定符合字符集描述的特徵字符重複次數。
如果限定符前面是跟著組,那麼就限定符合組內表達式描述的特徵字符串重複次數。

⑦正則表達式定位符及其含義
“ ^ ”匹配輸入字符串的開始位置
“ $ ”匹配輸入字符串的結束位置
“ \b ” 匹配一個單詞邊界,也就是指單詞和空格間的位置
“ \B ” 匹配非單詞邊界

⑧正則表達式的5個標誌位
“ g ” global 匹配多個
“ i ” ignoreCase不區分大小寫
“ m ” multiline 設置此標誌後,$和^可以分別匹配行的開頭和結尾
“ s ” dotall 設置此標誌後,“ . ”點號可以匹配換行符(\n)
“ x ” extended 允許擴展的正則表達式

⑨正則表達式中元字符優先級
相同優先級總左到右,不同優先級先高後低。
元字符優先級如下:
\
(), (?:), (?=), []
+, ?.,{n},{n,},{n,m}
^,$,\字符
|

2011年11月12日 星期六

[轉] AS3使用URLRequest和URLLoader與伺服器溝通

AS3 中使用URLLoader 與URLRequest 取代了先前版本LoadVars 方法. 初學者可能又會迷糊了.
在現在幫助系統沒有完善的情況下(Flash 9 沒有幫助, Flex Builder 2 的只有英文), 這裡寫篇簡單的教程, 方便大家往AS3 過渡.

在AS3 中, 有關於網路操作的內置類全部在flash.net 裡. 下面是本教程要用到的類的清單 :

URLLoader : 用於從網路或者本地讀取文件, 可以通過設置他的dataFormat 屬性改變收到的文本類型.
與AS2 的LoadVars 不同的是, 他的默認值URLLoaderDataFormat.TEXT 即純文字格式, 所以在讀取外部文本變量的時候得修改一下他的dataFormat 為URLLoaderDataFormat.VARIABLES. 不過在AS2 中沒有該屬性, 取代的是contentType 屬性.

URLRequest : 用於傳遞變量到伺服器, 以及URLLoader 要load 的目標路徑. 可以通過設置他的contentType 屬性改變發送到伺服器的變量類型, 默認是application/x-form-urlencoding, 也就是URLEncode 編碼.

URLVariables : 用於配置傳遞到伺服器變量的鍵/ 值集合, 如user1=Kakera&user2=Eigo.

URLLoaderDataFormat : 用於設置URLLoader 讀取文件的類型, 有TEXT (純文字), VARIABLES (URLEncoding 的鍵/ 值集合), BINARY (2 進制格式), URLLoader 會根據相應的類型進行解碼操作, 如解碼URLEncode

同時還有其他不常用的 :
URLRequestMethod : 決定使用哪種方式傳遞數據到伺服器, POST 或者GET.
URLReqeustHeader : 用於配置傳遞到服務端的HTTP 標頭.

值得一提的是, URLLoader 還有相當完整的事件讓我們來獲取讀取數據的狀態, 下面是有關URLLoader 事件的清單.

complete : 使用URLLoader.load() 方法後, 數據完全加載完畢時觸發, 通常如果能夠觸發這個事件的話, 說明你的程序沒有問題.

httpStatus : 使用URLLoader.load() 方法後, 獲取HTTP 狀態代碼時觸發, 通過判斷他的state 屬性我們可以獲得遠程文件的加載狀態. 成功(200), 沒有權限(403), 找不到文件( 404), 伺服器內部錯誤(500) 等等. 這個事件總是在compelete 之前被觸發.

ioError : 使用URLLoader.load() 方法時, 發生致命錯誤時觸發, 我還沒碰到過..

open : 使用URLLoader.load() 方法後, 開始從伺服器下載數據時觸發一次, 此時的URLLoader.bytesLoaded 一定是0.

progress : 使用URLLoader.load() 方法後, 在從伺服器下載數據的過程中持續觸發, 通過偵聽他的變化我們可以很方便的為URLLoader 做加載狀態的顯示.

securityError : FlashPlayer 的安全錯誤, 比如跨域加載, 從硬盤(文件系統) 發送/ 讀取伺服器上的數據.

關於註冊偵聽器的建議

flashplayer 內置類的所有事件都有相關事件類常量來表示, 推薦使用他們來註冊事件偵聽器. 而所有的內置類的事件類(Event) 全部在flash.events 包中,如使用:
window.attachEvent("onload",function (){AutoSizeDIV('CODE_7643')}) import flash.events.Event;
urlLoaderInstance.addEventListener(Event.COMPLETE, completeHandler);



來代替
urlLoaderInstance.addEventListener("complete", completeHandler);下面是URLLoader 支持的事件所對應類的清單, 他們可以在Flex Builder 2 的文檔中找到:

complete : Event.COMPLETE
httpStatus : HTTPStatusEvent.HTTP_STATUS
ioError : IOErrorEvent.IO_ERROR
open : Event.OPEN
progress : ProgressEvent.PROGRESS
securityError : SecurityErrorEvent.SECURITY_ERROR

然後下面是使用URLLoader 的一些簡單的例子

1. 單純的讀取伺服器或者硬盤上同目錄下叫Variables.txt 文本文件, 文本的內容是:
user1=Kakera&user2=Eigo&user3=KeiragoLoadVariablesOnly.fla
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置 URLRequest, 設置目標路徑等
//

var request:URLRequest = new URLRequest("Variables.txt");
/
// 配置 URLLoader, 註冊偵聽器等
//

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
 trace("Event.COMPLETE");
 trace("目標文件的原始數據(純文字) : " + loader.data);
 //
 // 使用URLVariables 處理原始數據並進行遍歷同時輸出數據
 //
 
 var variables:URLVariables = new URLVariables(loader.data);
 for (var i in variables) {
  trace(i + " : " + variables[i]);
 }

}
function loader_open (e:Event):void {
 trace("Event.OPEN");
 trace("讀取了的字節: " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
 trace("HTTPStatusEvent.HTTP_STATUS");
 trace("HTTP 狀態代碼 : " + e.state);
}
function loader_progress (e:ProgressEvent):void {
 trace("ProgressEvent.PROGRESS");
 trace("讀取了的字節: " + loader.bytesLoaded);
 trace("文件總字節 : " + loader.bytesTotal);
}
function loader_security (e:Secu​​rityErrorEvent):void {
 trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
 trace("IOErrorEvent.IO_ERROR");
}






2. 提交數據到ServerSide.asp, 並輸出伺服器的返回值

ServerSide.asp <%@LANGUAGE="Jscrīpt" CODEPAGE="65001"%>
<%  //  // 全局 Header, 設置編碼, 以及緩存  //  with (Response) {   Charset = "utf-8";   Buffer = true;   Expires = -10;   ContentType = "text/plain";  }    var buffer = "列出所有服務端接收到的變量: /n";  var i;  var e = new Enumerator(Request.Form);      //  // 遍歷集合  //    for (; !e.atEnd(); e.moveNext()) {   i = e.item();   buffer += String(i) + " : " + String(Request.Form(i)) + "/n";  }    Response.Write(buffer); %>

SendAndLoadVariables.fla

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置URLVariables, 設置傳遞到伺服器的數據
//
 
var variables:URLVariables = new URLVariables();
variables.userName = "Kakera";
variables.password = "********";


//
// 配置URLRequest, 設置目標路徑, 設置提交的數據, 方法(POST / GET)
//

var request:URLRequest = new URLRequest("http://localhost/urlloadersample/ServerSide.asp");
request.data = variables;
request.method = URLRequestMethod.POST;


//
// 配置 URLLoader, 註冊偵聽器等
//

var loader:URLLoader = new URLLoader();


//
// 服務端將要返回的是純文字數據
//

loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
 trace("Event.COMPLETE");
 trace("目標文件的原始數據(純文字) : /n" + loader.data);
}
function loader_open (e:Event):void {
 trace("Event.OPEN");
 trace("讀取了的字節: " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
 trace("HTTPStatusEvent.HTTP_STATUS");
 trace("HTTP 狀態代碼 : " + e.status);
}
function loader_progress (e:ProgressEvent):void {
 trace("ProgressEvent.PROGRESS");
 trace("讀取了的字節: " + loader.bytesLoaded);
 trace("文件總字節 : " + loader.bytesTotal);
}
function loader_security (e:Secu​​rityErrorEvent):void {
 trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
 trace("IOErrorEvent.IO_ERROR");

}

原文連結