關於Flex及AS3的百多條小小知識

出處: http://www.riahome.cn

Word文檔下載:     壓縮包下載

【改變輸出swf的尺度,背景顏色或幀頻】
在"Navigator"窗框裏右鍵你的項目>選中"Properties">選中"ActionScript Compiler">在"Additional compiler arguments"裏輸入你所需要的命令
如想改變背景顏色,請輸入: -default-background-color 0xffffff

【鼠標座標】
mouseX mouseY

【檢查變量類型並返回布爾值】
is

【檢查變量類型並返回類型】
typeof

【檢查對象類型並返回該對象】
as

【是數字但不是有效數字問題】
var quantity:Number = 15 - "rabbits";
trace(typeof quantity); //顯示: "number" , 但它是NaN (not a number)
trace(quantity is Number); //true
trace(quantity != NaN); //false
//使用isNaN()函數檢測:
isNaN(quantity); //true
//檢測變量是否內含有效數字:
!isNaN(quantity); //false

【取消默認的嚴格編譯模式】
在"Navigator"窗框裏右鍵你的項目>選中"Properties">選中"ActionScript Compiler">取消"Enabel compile-time type checking"選項

【基元數據類型和複雜數據類型好比"值類型"和"引用類型"】
基元數據類型類似按值傳遞:
var intOne:int = 1;
var intTwo:int = 1;
trace(intOne == intTwo); //true

【複雜數據類型類似按引用傳遞】
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = arrayOne;
trace(arrayOne == arrayTwo); //true
//-----------------------------------
var arrayOne:Array = new Array("a", "b");
var arrayTwo:Array = new Array("a", "b");
trace(arrayOne == arrayTwo); //false

【優化邏輯AND(&&)和OR(||)的小知識】
對於邏輯And(&&):
    除非條件表達式的前半部分爲真,否則,ActionScript不會再去求算邏輯AND運算符的後半部.如果前半部爲假,整個條件表達式一定爲假,所以再去求算後半部就沒效率了.
對於邏輯OR(||):
    除非條件表達式前半部爲假,否則,ActionScript不會再去求算邏輯OR運算符的後半部,如果前半部爲真,整個條件表達式一定爲真.
總結:使用邏輯AND(&&)時,把結果最可能爲false的表達式放到前面;使用邏輯OR(||)時,把結果最可能爲true的表達式放到前面.

【Timer類注意事項】
不要認爲Timer可以極其準確;使用Timer時間間隔不要低於10毫秒.

【private,protected,internal,public訪問權限】
private:只能在類本身內部訪問,按慣例,命名私有成員時以下劃線"_"開頭;
protected:可以由類本身或任何子類訪問.但這是以實例爲基礎的.換言之,類實例可以訪問自己的保護成員或者父類的保護成員,但不能訪問相同類的其它實例的保護成員,按慣例,命名保護成員時以下劃線"_"開頭;
internal:可以由類本身或者相同包內的任何類訪問;
public:可以在類內部訪問,也可以由類實例訪問,或者聲明爲static時,可以直接從類訪問.

【一個函數具有未知個數的參數,用arguments對象或"...(rest)"符號訪問它的參數】
注意:使用"...(rest)"參數會使 arguments 對象不可用;
private funciton average():void{
    trace(arguments.length); //輸出參數的個數
    // arguments的類型是:object,但可以像訪問數組一樣去訪問它
    trace(arguments[1]); //輸出第二個參數
}
private function average(...argu):void{
    trace(argu[1]); //輸出第二個參數,argu參數名是自定義的.
}

【錯誤處理try,catch,finally】
private function tryError():void{
    try {
        trace("測試開始-try");
        throwError();
    }catch(errObject:Error) {
        trace("錯誤信息:" + errObject.message);
        trace("測試結束-catch");
        return;
    }finally{
        trace("雖然catch裏已經有return方法,但位於return方法後面的finally裏的代碼依然會被執行.其實無論return方法是在try裏,還是catch裏,finally裏的代碼始終會被執行");
    }
    trace("前面已經有return了,此處是不會再執行的.除非沒有拋出錯誤,以使catch裏的代碼沒有被執行");
}
private function throwError():void{
    throw new Error("拋出錯誤");
}

【for...in與for each...in的區別】
與for...in循環不同的是,for each...in循環中的迭代變量包含屬性所保存的值,而不包含屬性的名稱(或主鍵,索引).

【命名包路徑的小技巧】
    使用相應於擁有者和相關項目的包名稱會比較好.按慣例來講,包名稱的開頭應該是逆向的網址名稱.例如,如果Example Corp(examplecorp.com)寫了一些ActionScript3.0類,就會把所有類放在com.examplecorp包內(或者 com.examplecorp的子包內).如此一來,如果英國有另一家Example Corp(examplecorp.co.uk)也寫了一些ActionScript3.0類,只要使用包uk.co.examplecorp,就可確保 唯一性.
    當類屬於特定應用程序的一部分時,就應該放在該應用程序特定的子包內.例如,Example Corp可能有個應用程序名叫WidgetStore.如果WidgetStore應用程序使用一個名爲ApplicationManager的類,則此 類就應該放在com.examplecorp.widgetstore包內,或者位於該包的子包內.
    按慣例來說,包名稱的開頭是小寫字母.

【隱式的取出方法(getter)和設定方法(setter)】
public function get count():uint {
    return _count;
}
public function set count(value:uint):uint {
    if(value < 100){
        _count = value;
    }else {
        throw Error();
    }
}

【確保類是絕不會有子類,使用final】
final public class Example{}

【super關鍵字的使用】
super(); //父類的構造函數,只能在類實例構造函數內部使用
super.propertyName; //調用父類的屬性,屬性需要聲明爲public或protected
super.methodName(); //調用父類的方法,方法需要聲明爲public或protected

【建立常數,使用關鍵字const而不是var】
static public const EXAMPLE:String = "example";

【檢測播放器版本】
flash.system.Capabilities.version
對於8.5版以前的任何Flash Player版本,這種方法都不適用.

【判斷客戶端系統】
flash.system.Capabilities.os

【檢測播放器類型】
flash.system.Capabilities.playerType
可能的值有:
"StandAlone",用於獨立的 Flash Player
"External",用於外部的 Flash Player 或處於測試模式下
"PlugIn",用於 Flash Player 瀏覽器插件
"ActiveX",用於 Microsoft Internet Explorer 使用的 Flash Player ActiveX 控件

【檢測系統語言】
flash.system.Capabilities.language

【判斷用戶是否啓用了IME(輸入法編輯器)】
flash.system.IME.enabled

【檢測屏幕的分辨率】
flash.system.Capabilities.screenResolutionX
flash.system.Capabilities.screenResolutionY

【把彈出窗口居中的算法】
X = (舞臺寬/2)-(窗口寬/2)
Y = (舞臺高/2)-(窗口高/2)

【控制影片配合Player的方式,包括縮放問題】
stage.scaleMode
可供選擇值:flash.display.StageScaleMode

【舞臺的對齊方式】
stage.align
可供選擇值:flash.display.StageAlign

【隱藏Flash Player的右鍵菜單】
stage.showDefaultContextMenu = false;

【檢測系統是否具有音頻功能】
flash.system.Capabilities.hasAudio

【檢測播放器是在具有MP3解碼器的系統上運行,還是在沒有MP3解碼器的系統上運行】
flash.system.Capabilities.hasMP3

【檢測播放器能 (true) 還是不能 (false) 播放流式視頻】
flash.system.Capabilities.hasStreamingVideo

【檢測播放器是在支持 (true) 嵌入視頻的系統上運行,還是在不支持 (false) 嵌入視頻的系統上運行】
flash.system.Capabilities.hasEmbeddedVideo

【檢測播放器能 (true) 還是不能 (false) 對視頻流(如來自 Web 攝像頭的視頻流)進行編碼】
flash.system.Capabilities.hasVideoEncoder

【顯示 Flash Player 中的"安全設置"面板】
flash.system.Security.showSettings();
可供選擇項:flash.system.SecurityPanel

【讓其它域的.swf訪問本域的.swf】
在本域的.swf文件里加上:flash.system.Security.allowDomain()
或者使用安全策略文件"crossdomain.xml".在Flash 8以前,這個文件必須放在.swf所在域的根目錄,現在,你可以使用flash.system.Security.loadPolicyFile(),指 定安全策略文件所在的位置.拒絕任何域的做法是在<cross-domain-policy>標籤內什麼也不填,安全策略文件也支持通用字符 "*":
<?xml version="1.0"?>
<!-- http://www.mydomain.com/crossdomain.xml -->
<cross-domain-policy>
    <allow-access-from domain="www.riahome.cn" />
    <allow-access-from domain="*.Y-boy.cn" />
    <allow-access-from domain="210.38.196.48" />
    <allow-access-from domain="*" />
</cross-domain-policy>

【數字的不同進制之間的轉換】
parseInt(str:String, radix:uint = 0):Number 返回十進制的數,參數radix表示要分析的數字的基數.如果省略radix,就默認爲10,除非字符串的開頭是"0x","0X"或"0":
trace(parseInt("0x12")); //設定radix爲16,輸出:18
trace(parseInt("017")); //設定radix爲8,輸出:15
或者使用Number,uint和int對象的toString(radix)方法.

【使用Math.round()對一個數取整,四捨五入】
Math.round()
trace(Math.round(204.499)); //輸出:204
trace(Math.round(401.5)); //輸出:402

【使用Math.floor()對一個數向下取整,就是隻要整數部分而不理會小數分】
trace(Math.floor(204.99)); //輸出:204

【使用Math.ceil()對一個數向上取整,只要小數部分不爲零,整數部分就加1】
trace(Math.ceil(401.01)); //輸出:402

【產生一個隨機數】
使用Math.random()產生一個僞隨機數n,其中 0 <= n < 1

【把數字取至最近的小數點位,即指定精確度】
1. 決定你要取的數字的小數點位數:例如,如果你想把90.337取成90.34,就表示你要取到兩位小數點位,也就是說你想取至最近的0.01;
2. 讓輸入值除以步驟1所選的數字(此例爲0.01);
3. 使用Math.round()把步驟2所計得的值取成最近的整數;
4. 把步驟3所得的結果乘以步驟2用於除法的那個值.
例如,要把90.337取成兩個小數點位數,可以使用:
trace(Math.round(90.337/0.01)*0.01); //輸出:90.34

【把數字取成一個整數的最接近倍數值】
例1,這樣會把92.5取成5的最近倍數值:
trace(Math.round(92.5/5)*5); //輸出:95
例2,這樣會把92.5取成10的最近倍數值:
trace(Math.round(92.5/10)*10); //輸出:90

【在指定數值範圍內獲得隨機數】
//可取範圍:[min, max]
private function randRange(min:Number, max:Number):Number {
    var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
    return randomNum;
}
應用例子:
模擬投銀幣,即希望得到隨機布爾值(true 或 false): randRange(0, 1);
模擬投骰子,即希望得到隨機六個值: randRange(1, 6);
爲避免被緩存而需要產生一個獨一無二的數字追加在URL尾端,通常最佳方法是取得當前毫秒數.

【弧度(radian)與度數(degree)之間的轉換】
從弧度轉爲度數: degrees = radians * 180 / Math.PI
從度數轉爲弧度: radians = degrees * Math.PI / 180

【計算兩點之間的距離】
勾股定理: c2 = a2 + b2
假設有兩個影片剪輯mc1和mc2,則它們兩點間的距離c爲:
var c:Number = Math.sqrt(Math.pow(mc1.x - mc2.x, 2) + Math.pow(mc1.y - mc2.y, 2));

【模擬圓周運動】
已知圓心o(x0, y0),半徑r和弧度angle,求圓上任意一點P(x, y)的座標:
x = x0 + (Math.cos(angle) * r);
y = y0 + (Math.sin(angle) * r);
注意:舞臺的x軸正方向水平向右,y軸正方向垂直向下.

【模擬橢圓運動】
已知圓心o(x0, y0),長軸a,短軸b以及弧度angle,求圓上任意一點P(x, y)的座標:
x = x0 + (Math.cos(angle) * a);
y = y0 + (Math.sin(angle) * b);


【華氏溫度和攝氏溫度之間的轉換】
華氏溫度 = 攝氏度數 * 9 / 5 + 32
攝氏溫度 = (華氏度數 - 32) * 5 /9

【公斤與磅之間的轉換】
公斤 = 磅 * 2.2
磅 = 公斤 / 2.2

【向數組尾端添加元素】
var array:Array = new Array();
array.push("a", "b");
//向數組尾端添加單一元素也可以這樣:
array[array.length] = "c";
//如果以索引設定的元素不存在,數組本身會自動擴展以包含足夠的元素數目.介於中間的元素會被設爲undefined:
array[5] = "e";
trace(array[4]); //輸出: undefined

【向數組開端添加元素】
var array:Array = ["a", "b"];
array.unshift("c", "d");
trace(array); //輸出: c,d,a,b

【刪除數組中第一個元素並返回該元素,使用shift()方法】
var letters:Array = new Array("a", "b", "c");
var firstLetter:String = letters.shift();
trace(letters); //輸出: b,c
trace(firstLetter); //輸出: a

【刪除數組中最後一個元素並返回該元素的值,使用pop()方法】
var letters:Array = new Array("a", "b", "c");
trace(letters); //輸出: a,b,c
var letter:String = letters.pop();
trace(letters); //輸出: a,b
trace(letter); //輸出: c

【刪除數組中的元素,給數組添加新元素並返回刪除的元素,使用splice()方法】
splice(startIndex:int, deleteCount:uint, ... values):Array
startIndex: 一個整數,它指定數組中開始進行插入或刪除的位置處的元素的索引;
deleteCount: 一個整數,它指定要刪除的元素數量;
... values: 用逗號分隔的一個或多個值的可選列表或數組,此列表或數組將插入到此數組中由 startIndex 參數指定的位置.

【查找數組中第一個相匹配的元素】
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = 0; i < array.length; i++) {
    if(array[i] == match) {
        trace("Element with index " + i + " found to match " + match);
        //輸出: Element with index 1 found to match b
        break;
    }
}

【查找數組中最後一個相匹配的元素】
var array:Array = ["a", "b", "c", "d", "a", "b", "c", "d"];
var match:String = "b";
for(var i:int = array.length - 1; i >= 0; i--) {
    if(array[i] == match) {
        trace("Element with index " + i + " found to match " + match);
        //輸出: Element with index 5 found to match b
        break;
    }
}

【把字符串轉成數組】
使用String.split()方法:
var list:String = "I am YoungBoy.";
var words:Array = list.split(" "); //以空格作爲分隔符將字符串切割
trace(words); //輸出: I,am,YoungBoy.

【把數組轉成字符串】
使用String.join()方法:
var myArr:Array = new Array("one", "two", "three");
var myStr:String = myArr.join(" and ");
trace(myArr); //輸出: one,two,three
trace(myStr); //輸出: one and two and three

【使用對象數組處理相關數據】
var cars:Array = new Array();
cars.push({make:"Mike", year:1997, color:"blue"});
cars.push({make:"Kelly", year:1986, color:"red"});
for(var i:int = 0; i < cars.length; i++) {
    trace(cars[i].make + " - " + cars[i].year + " - " + cars[i].color);
}
//輸出:
//     Mike - 1997 - blue
//     Kelly - 1986 - red

【在數組中獲取最小或最大值】
var scores:Array = [10, 4, 15, 8];
scores.sort(Array.NUMERIC);
trace("Minimum: " + scores[0]);
trace("Maximum: " + scores[scores.length - 1]);

【使用for ... in語句讀取關聯數組元素】
var myObject:Object = new Object();
myObject.name = "YoungBoy";
myObject.age = 20;
for(var i:String in myObject) {
    trace(i + ": " + myObject[i]);
}
//輸出: name: YoungBoy
//      age: 20
注意: for ... in循環不會顯示對象所有的內建屬性.例如,循環會顯示執行期間新增的特殊屬性,但是,不會列出內建對象的方法,即使都是儲存在對象屬性內.

【AVM(ActionScript Virtual Machine,虛擬機)和渲染引擎(Rendering Engine)】
AVM負責執行ActionScript程序,而渲染引擎則是把對象繪製在顯示器上.

【指出容器的顯示清單中有多少顯示對象】
每個容器都有numChildren屬性.

【把項目新增至顯示清單】
addChild(child:DisplayObject)
addChildAt(child:DisplayObject, index:int)
index: 添加該子項的索引位置.如果指定當前佔用的索引位置,則該位置以及所有更高位置上的子對象會在子級列表中上移一個位置.

【從顯示清單中移除項目】
removeChild(child:DisplayObject)
removeChildAt(index:int)
index: 要刪除的 DisplayObject 的子索引,該子項之上的任何顯示對象的索引位置都減去1.
如果想移除窗口所有子元件,可以結合removeChildAt(),numChildren屬性以及for循環.因爲每次一個子元件被移除時,索引位置都會變化,所以,有兩種方法可以處理所有子元件的移除:
1. 總是移除位置0的子元件;
2. 倒過來移除子元件,也就是從尾端開始.

【更改現有子項在顯示對象容器中的位置】
setChildIndex(child:DisplayObject, index:int):void
可能用到的方法:
返回 DisplayObject 的 child 實例的索引位置: getChildIndex(child:DisplayObject):int
返回位於指定索引處的子顯示對象實例: getChildAt(index:int):DisplayObject
注意: 當子元件移到低於它現在所在位置的索引時,那麼,從標的索引起,直到子元件索引前面的那個索引的所有子元件都會令其索引增加1,而該子元件就會指定至標的 索引.當子元件移到較高索引時,從該子元件索引之上的那個索引起,直到標的索引的所有子元件都會令其索引往下減1,而該子元件就會指定至標的索引值.

【關於TextField以垂直方式把文字擺在按鈕表面中心點的小技巧】
textField.y = (_height - textField.textHeight) / 2;
textField.y -= 2; //減2個像素以調整偏移量

【外部.swf影片載入和互動】
1. 監聽init事件;
2. 透過content屬性存取所載入的影片.
當所載入的影片做好足夠的初始化工作,使其方法和屬性可以接受互動時,init事件就會被髮起.只有在載入器發起init事件後,才能控制影片.所載入的影片還沒初始化就試着與它互動,是會產生執行期間錯誤的.
_loader.contentLoaderInfo.addEventListener(Event.INIT, handleInit); //當載入的.swf的屬性和方法可用時
_loader.load(new URLRequest("ExternalMovie.swf"));
private function handleInit(event:Event):void {
    var movie:* = _loader.content;
    trace(movie.getColor());
    movie.setColor(0xFF0000);
}

【TextField有兩種類型:動態(dynamic)和輸入(input),默認值爲動態.改變TextField類型方法】
field.type = TextFieldType.INPUT; //selectable屬性默認值爲true
flash.text.TextFieldType.INPUT和flash.text.TextFieldType.DYNAMIC

【過濾文字輸入】
TextField.restrict = "此處爲可輸入的內容";
field.restrict = "^此處爲禁止輸入的內容";
restrict屬性支持一些類似正則表達式的樣式:
field.restrict = "a-zA-z"; //只允許大小字母
field.restrict = "a-zA-z "; //只允許字母和空格
field.restrict = "0-9"; //只允許數字
field.restrict = "^abcdefg"; //除了小寫字母abcdefg不允許外,其它都允許
field.restrict = "^a-z"; //所有小寫字母都不允許,但是,其它內容都允許,包括大寫字母
field.restrict = "0-9^5"; //只允許數字,但5例外
讓restrict字符包含具有特殊意義的字母(例如-和^):
field.restrict = "0-9//-"; //允許數字和破折號
field.restrict = "0-9//^"; //允許數字和^
field.restrict = "0-9////"; //允許數字和反斜槓
你也可以使用Unicode轉義序列,指定允許的內容.例如:
field.restrict = "^/u001A";
注意:ActionScript有區分大小寫的,如果restrict屬性設爲abc,允許字母的大寫形式(A,B和C)輸入時會變成小寫對待形式(a,b和c),反之亦然.restrict屬性隻影響用戶可以輸入的內容,腳本可將任何文本放入文本字段中.

【設定輸入框的最大長度】
TextField.maxChars:int

【向TextField追加內容】
TextField.appendText(text:String):void
與通過對 text 屬性使用加法賦值來連接兩個字符串(例如 field.text += moreText)相比,此方法的效率更高.

【顯示HTML格式的文字】
TextField.htmlText = "<b>Html text</b>";
支持的HTML標籤集有: <b>,<i>,<u>,<font>(有face,size以及color屬性),< p>,<br>,<a>,<li>,<img>以及<textformat>(有 leftmargin,rightmargin,blockindent,indent,leading以及tabstops屬性,相應於 TextFormat類的同名屬性)

【縮減空白】
TextField.condenseWhite = true;
刪除具有HTML文本的文本字段中的額外空白(空格,換行符等),如同多數HTML瀏覽器所做的那樣.
注意: 在設置 htmlText 屬性之前設置 condenseWhite 屬性

【自動大小調整和對齊】
TextField.autoSize = TextFieldAutoSize.LEFT;
可選之值:
flash.text.TextFieldAutoSize.CENTER
flash.text.TextFieldAutoSize.LEFT
flash.text.TextFieldAutoSize.NONE
flash.text.TextFieldAutoSize.RIGHT

【指示文本字段是否自動換行】
TextField.wordWrap = true; //自動換行

【用程序手段滾動文字】
水平方向以像素爲單位,而垂直方向以行做單位:
scrollV: 指出文字框可見區域的最頂行,可讀寫;
bottomScrollV: 指出文字框內最底端可見行,只讀;
maxScrollV: scrollV的最大值,只讀;
numLines: 定義多行文本字段中的文本行數,只讀;
TextField.scrollV = field.maxScrollV; //滾動到最後一頁

【響應滾動事件】
field.addEventListener(Event.SCROLL, onTextScroll);

【樣式化文字的方法】
1. 使用HTML標籤進行樣式化;
2. 使用TextFormat對象;
3. 使用CSS.
例如: HTML是用<font>標籤,TextFormat對象是設定font屬性,而CSS是使用font-family屬性的.
受支持的層疊樣式表(CSS)屬性和值,及其相應的ActionScript屬性名稱(小括號內):
color(color),display(display),font-family(fontFamily),font-size(fontSize),font-style(fontStyle),font-weight(fontWeight),kerning(kerning),leading(leading),letter-spacing(letterSpacing),margin-left(marginLeft),margin-right(marginRight),text-align(textAlign),text-decoration(textDecoration),text-indent(textIndent)
受支持的HTML實體: <(小於號: &lt;), >(大於號: &gt;), &(和: &amp;), "(雙引號: &quot;), '(撇號,單引號: &apos;)
其中樣式對象的兩種寫法:
寫法一:
var sampleStyle:Object = new Object();
sampleStyle.color = "#FFFFFF";
sampleStyle.textAlign = "center";
css.setStyle(".sample", sampleStyle);
寫法二:
var sampleStyle:Object = {color: "#FFFFFF", textAlign: "center"};
css.setStyle(".sample", sampleStyle);

【對用戶輸入的文字進行樣式化】
使用defaultTextFormat屬性,樣式會施加至用戶鍵入輸入框的文字身上:
var formatter:TextFormat = new TextFormat();
formatter.color = 0x0000FF; //把文字變成藍色
field.defaultTextFormat = formatter;

【對現有文字的一部分進行樣式化】
TextFormat.setTextFormat(format:TextFormat, beginIndex:int = -1, endIndex:int = -1):void

【設定文字框的字體】
例子:
HTML: field.htmlText = "<font face='Arial'>Formatted text</font>";
TextFormat: formatter.font = "Arial";
CSS: P{ font-family: Arial; }
也可以使用以逗號隔開的字體清單: formatter.font = "Arial, Verdana, Helvetica";
注意:
字體和字體羣組不同.字體羣組有三種: _sans,_serif以及_typewriter.
_sans羣組一般就是指Arial或Helvetica這種字體;
_serif羣組一般就是指Times或Times New Roman這種字體;
_typewriter羣組一般就是指Courier或Courier New這種字體.

【嵌入字體】
使用[Embed]後設標籤.[Embed]後設標籤應該出現在ActionScript文件中,處於類宣告之外.你可以內嵌TrueType字體或系統字體.內嵌TrueType字體時的語法:
[Embed(source="pathToTtfFile", fontName="FontName", mimeType="application/x-font-truetype")]
pathToTtfFile: ttf文件的路徑,TrueType字體的路徑可以是相對的,也可以是絕對的;
FontName: 字體名稱;
內嵌系統字體的語法:
[Embed(systemFont="Times New Roman", fontName="Times New Roman", mimeType="application/x-font-truetype")]
fontName: 以相同名稱作爲實際系統字體名稱.
注意: 在使用嵌入字體時,要把TextField的embedFonts屬性設爲true,這樣TextField只能用內嵌字體了.如果你試着替 embedFonts設爲true的TextField使用設備字體,什麼都不會顯示.如果embedFonts設爲true,就無法指定以逗號相隔的字 體清單.

【建立可以旋轉的文字】
使用內嵌字體.當你旋轉文字框時,設備字體就會消失.

【顯示Unicode文字】
1. 從外部來源載入Unicode文字;
2. 假如你的編輯器支持Unicode(如 Flex Builder),則可以直接在ActionScript程序中使用該字符;
3. 使用Unicode轉義字符,ActionScript裏所有Unicode轉義字符都以/u開頭,後面再跟四位十六進制數字.
注意: 如果你想取得Unicode字符,在Windows下使用: 開始>所有程序>附件>系統工具>字符映射表.

【把Flash Player的焦點帶給文字框】
stage.focus = field;
把焦點移除:
stage.focus = null;
注意: 當.swf文件首次載入至網頁瀏覽器時,並沒有焦點.因此,以程序的方式把焦點指定給Flash應用程序的一個元素前,必須先把焦點移至Flash Player.

【以ActionScript選取文字】
使用TextField.setSelection(beginIndex:int, endIndex:int):void
爲了可以正常選取文字,文字框必須具有焦點:
stage.focus = field; //把焦點設給文字框
field.text = "This is example text"; //設定文字
field.setSelection(0, 4); //把"This"這個單詞以高亮顯示
使用只讀的selectionBeginIndex和selectionEndIndex屬性訪問所選取的字符範圍的索引.

【在文字內設定安插點(遊標位置)並訪問遊標位置的索引值】
可以使用TextField.setSelection()把起始和結尾的索引參數都設成相同值,在文字內設定遊標位置(假設具有焦點):
field.setSelection(0, 0); //在第一個字符前擺放安插點
trace(field.caretIndex); //輸出遊標位置的索引值

【當文本字段受到選取或取消選取時給予響應】
獲得焦點時: FocusEvent.FOCUS_IN
失去焦點時: FocusEvent.FOCUS_OUT
通過鍵盤(Tab鍵)把焦點移除時: FocusEvent.KEY_FOCUS_CHANGE
通過鼠標把焦點移除時: FocusEvent.MOUSE_FOCUS_CHANGE
FocusEvent類有一個relatedObject屬性.就FOCUS_IN事件而言,relatedObject屬性是剛纔擁有焦點的對象的引用 地址;對於FOCUS_OUT,KEY_FOCUS_CHANGE以及MOUSE_FOCUS_CHANGE事件,relatedObject屬性是剛接 收到焦點的對象的引用地址.
FOCUS_IN和FOCUS_OUT事件都是在焦點改變後發生的,所以兩者都是不可取消的事件.對於KEY_FOCUS_CHANGE和MOUSE_FOCUS_CHANGE事件,可以使用FocusEvent.preventDefault()方法取消默認行爲:
field.addEventListener(FocusEvent.KEY_FOCUS_CHANGE, onKeyFocus);
private function onKeyFocus(event:FocusEvent):void {
    if(field.text == "") {
        event.preventDefault(); //當field沒有任何文字前,不允許使用Tab鍵把焦點移除
    }
    //event.relatedObject就是剛纔擁有焦點的對象的引用地址,即下一個獲得焦點的對象的引用地址
}

【響應用戶的輸入行爲】
field.addEventListener(TextEvent.TEXT_INPUT, onTextInput);
private function onTextInput(event:TextEvent):void {
    if(event.text == "a" && field.length == 0) {
        event.preventDefault(); //TEXT_INPUT是可以取消的事件.TextEvent有一個text屬性,內含用戶所輸入的的字符.此例子確保用戶輸入的第一個字母不是"a"
    }
}

【把超鏈接加入文字】
打開網頁:
例子1:
var css:StyleSheet = new StyleSheet();
css.parseCSS("a{color:#0000FF;} a:hover{text-decoration:underline;}");
field.styleSheet = css;
field.htmlText = "<a href='http://www.riahome.cn' target='_blank'>Link text</a>";
例子2:
field.text = "Link text";
var formatter:TextFormat = new TextFormat();
formatter.url = "http://www.riahome.cn";
formatter.target = "_blank";
field.setTextFormat(formatter);
打開Email:
field.text = "Link text";
var formatter:TextFormat = new TextFormat();
formatter.url = "mailto:[email protected]";
field.setTextFormat(formatter);
使用event協議,打開ActionScript方法:
field.htmlText = "<a href='event:http://www.riahome.cn'>www.RIAHome.cn</a>";
field.addEventListener(TextEvent.LINK, onClickHyperlink);
private function onClickHyperlink(event:TextEvent):void {
    trace(event.text); //輸出: http://www.riahome.cn
}

【精確獲取某字符的索引值】
在 x 和 y 參數指定的位置返回從零開始的字符索引值
TextField.getCharIndexAtPoint(x:Number, y:Number):int
例子:
field.getCharIndexAtPoint(mouseX, mouseY); //返回鼠標位置上的該字符的索引值

【精確獲取某字符的邊框區域】
TextField.getCharBoundaries(charIndex:int):Rectangle
通過讀取Rectangle的x,y,width以及height等屬性來確定該字符的邊框區域範圍.

【精確獲取某行的索引值】
在 x 和 y 參數指定的位置返回從零開始的行索引值
TextField.getLineIndexAtPoint(x:Number, y:Number):int
field.getLineIndexAtPoint(mouseX, mouseY); //返回鼠標位置上的該行的索引值

【獲取指定索引值處的字符所在行的行索引值】
TextField.getLineIndexOfChar(charIndex:int):int

【獲取指定行的字符數】
TextField.getLineLength(lineIndex:int):int

【獲取指定索引值處的行所包含的字符】
TextField.getLineText(lineIndex:int):String

【獲取指定行索引所在行的第一個字符的索引值】
TextField.getLineOffset(lineIndex:int):int

【獲取指定文本行的度量信息】
TextField.getLineMetrics(lineIndex:int):TextLineMetrics
TextLineMetrics類包含文本字段中某行文本的文本位置和度量值的相關信息,幫助文檔裏有深入的圖解.

【獲取指定索引處的字符所在段落內的第一個字符索引值】
如果給定一個字符索引,則返回同一段落中第一個字符的索引
TextField.getFirstCharInParagraph(charIndex:int):int

【獲取指定索引處的字符所在段落內的字符數】
TextField.getParagraphLength(charIndex:int):int

【替換所選文字】
TextField.replaceSelectedText(value:String):void
可以使用此方法插入和刪除文本而不破壞其餘文本的字符和段落格式.

【替換指定範圍的文本】
TextField.replaceText(beginIndex:int, endIndex:int, newText:String):void
注意: 如果對文本字段應用了樣式表,則該方法不起作用

【Timer計時器的使用】
var timer:Timer = new Timer(delay:Number, repeatCount:int = 0);
timer.addEventListener(TimerEvent.TIMER, onTimer);
timer.start();
private function onTimer(event:TimerEvent):void {
    //code
}

【以指定方向和速度移動元件】
speed: 目標速度
radians: speed與x軸的夾角,弧度
vx = Math.cos(radians) * speed;
vy = Math.sin(radians) * speed;

【緩動動畫算法】
targetX,targetY: 目標座標;
easingSpeed: 每次移動分數,範圍0到1;
var vx:Number = (targetX - sprite.x) * easingSpeed;
var vy:Number = (targetY - sprite.y) * easingSpeed;
sprite.x += vx;
sprite.y += vy;
注意: 在非常逼近目標點時,往往找出通往目標點的距離,如果其值少於特定值,就應該停止該緩動.

【模擬彈簧往復運動算法】
五個變量: targetX(目標點的x座標),sprite.X(物體的x座標),vx(水平速度),ax(水平加速度),k(彈簧強度)
已知: targetX(目標點的x座標),k(彈簧強度)
var ax:Number = (targetX - sprite.x) * k;
vx += ax;
sprite.x += vx;
注意: 這裏只是水平方向的情形,也可以推廣到垂直方向以及水平垂直一起來的情形

【模擬單擺運動】
四個變量: sprite.x(物體的x座標),centerX(中心位置的x座標),angle(弧度),radius(擺動的振幅,也就是擺動的範圍)
sprite.x = centerX + Math.sin(angle) * radius;
angle += 0.05;

【模擬阻尼運動】
六個變量: targetX(目標點的x座標),sprite.X(物體的x座標),vx(水平速度),ax(水平加速度),k(彈簧強度),damp(阻尼係數)
已知: targetX(目標點的x座標),k(彈簧強度)
var ax:Number = (targetX - sprite.x) * k;
vx += ax;
sprite.x += vx;
vx *= damp; //無阻力情況下的彈簧往復運動只缺少此句
注意: 這裏只是水平方向的情形,也可以推廣到垂直方向以及水平垂直一起來的情形.
這種原理可以推廣到其它屬性,如scaleX:
scaleVel += (targetScale - sprite.scaleX) * k;
sprite.scaleX += scaleVel;
scaleVel *= damp;

【計算兩點間的角度】
Math.atan2(y:Number, x:Number):Number
y: 兩點間的垂直距離
x: 兩點間的水平距離
返回一個以弧度爲單位的角度,返回值介於正PI和負PI之間.

【讓物體指着鼠標(跟隨眼睛)】
var dx:Number = mouseX - sprite.x;
var dy:Number = mouseY - sprite.y;
var radians:Number = Math.atan2(dy, dx);
sprite.rotation = radians * 180 / Math.PI;

【聯結字符串時需要注意的地方】
var result:String = 2 + 6 + "a";
trace(result); //輸出: 8a
var result:String = "a" + 2 + 6;
trace(result); //輸出: a26
var result:String = "a" + (2 + 6);
trace(result); //輸出: a8

【查找匹配的字符串】
使用String.indexOf(val:String, startIndex:Number = 0):int
返回指定子字符串的第一個匹配項的索引,沒有匹配就返回-1
查找所有匹配的字符串:
var index:int = -1;
while((index = myString.indexOf("val", index + 1)) != -1) {
    trace("結果:" + index);
}
使用String.lastIndexOf(val:String, startIndex:Number = 0x7FFFFFFF):int
返回指定子字符串的最後一個匹配項的位置,沒有匹配就返回-1
var index:int = myString.length;
while((index = myString.lastIndexOf("val", index - 1)) != -1) {
    trace("結果:" + index);
}
注意: indexOf()和lastIndexOf()方法都是區分大小寫的.想把大小寫都查找出來的話,可以結合String.toLowerCase()和String.toUpperCase()方法先把字符串一起轉爲小寫或大寫再進行查找.

【提取子字符串】
String.substr(startIndex:Number = 0, len:Number = 0x7fffffff):String
String.substring(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String
String.slice(startIndex:Number = 0, endIndex:Number = 0x7fffffff):String
substr()第一個參數可以是負值,表示索引值是從字符串尾端算過來,-1是最後一個字符;
substring()和slice()差別在於substring()只接受正索引值,而把負值作爲0處理.另外,如果endIndex小於startIndex,substring()方法在執行前,會自動將其調換過來,總是使用兩個參數中較小的值作爲起始索引.
slice()方法可接受startIndex和endIndex爲負值,而把負值表示爲從字符串的尾端算回來,如果endIndex小於startIndex,slice()方法會返回空字符串.

【以指定模式拆分字符串】
String.split(delimiter:*, limit:Number = 0x7fffffff):Array

【替換指定的字符串】
使用String.replace(pattern:*, repl:Object):String
可以這樣來替換所有指定的字符串: myString.split("a").join("b");

【按單詞或單個字母逆轉字符串】
1. 把字符串切割使用String.split()方法成一個數組:對單詞而言,以空格作爲分界符,對字母而言,以空字符("")作爲分界符;
2. 使用Array.reverse()方法對數組進行逆轉;
3. 使用Array.join()方法重新組合爲字符串:對單詞而言,以空格(" ")作爲聯結符,對字母而言,以空字符("")作爲聯結符;

【使用SharedObject及捕獲異常】
var so:SharedObject = SharedObject.getLocal("so");
so.data.userName = "Youthoy";
try {
    var flushResult:String = so.flush(500 * 1024); //請求500KB容量
    //如果flush()沒成功執行,就替netStatus加個事件處理函數以確認用戶是同意還是拒絕,否則只檢驗結果.
    if(flushResult == SharedObjectFlushStatus.PENDING) {
        //替netStatus加個事件處理函數,使得我們可以檢驗用戶是否同意以足夠磁盤容量儲存共享對象.當netStatus事件發生時,執行onStatus函數.
        so.addEventListener(NetStatusEvent.NET_STATUS, onStatus);
    }else if(flushResult == SharedObjectFlushStatus.FLUSHED) {
        //成功儲存.把數據成功儲存後你想執行的程序放在這裏.
    }
}catch(e:Error) {
    //這裏表示用戶把本地儲存設置爲"拒絕".如果儲存數據很重要,你會想在此警告用戶.
    //此外,如果你想讓用戶可修改其設定值,可以用下面語句打開Player的"設置"對話框的本地儲存頁面.
    Security.showSettings(SecurityPanel.LOCAL_STORAGE);
}
//定義onStatus函數以處理共享對象的狀態事件.flush()返回"pending"時,引發提示,而用戶做了選擇後所引發的事件.
function onStatus(event:NetStatusEvent):void {
    if(event.info.code == "SharedObject.Flush.Success"){
        //如果event.info.code內容是"SharedObject.Flush.Success",表示用戶同意.把用戶同意後你想執行的程序放在這裏.
    }else if(event.info.code == "SharedObject.Flush.Failed"){
        //如果event.info.code內容是"SharedObject.Flush.Failed",表示用戶同意.把用戶拒絕後你想執行的程序放在這裏.
    }
    //現在,移除事件監聽器,因爲我們只需監聽一次.
    so.removeEventListener(NetStatusEvent.NET_STATUS, onStatus);
}

【向LSO儲存對象時需要注意】
LSO使用二進制的AMF(Action Message Format)對一個對象進行編碼.當你在LSO儲存類對象時,該對象會編碼成包含內容屬性的普通對象.於是,當你試着從共享對象裏讀取該對象時,無法被 讀成某類的對象,因爲沒有類型數據.要克服這個限制,使用flash.net.registerClassAlias()方法.
任何影片中,只要從共享對象讀取出自定義對象數據,自定義類就必須註冊別名,而且調用registerClassAlias()方法時必須在SharedObject.getLocal()方法被調用之前.

【要相同域名內的兩個影片可以存取相同LSO】
首先LSO是儲存在以下目錄下:
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects
例如,如果來自於http://www.riahome.cn/youthoy的影片movie.swf寫入名爲example的LSO,則數據會儲存在以下位置:
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects/[random directory name]/riahome.cn/youthoy/movie.swf/example.sol
如果在這個movie.swf裏的代碼是這樣的: var example:SharedObject = SharedObject.getLocal("example", "/"); 也就是使用了選用的本地路徑參數,則LSO會儲存在以下路徑,注意到與以上路徑少了"youthoy/movie.swf":
C:/Documents and Settings/[user name]/Application Data/Macromedia/Flash Player/#SharedObjects/[random directory name]/riahome.cn/example.sol
以此方法建立的LSO,可以由相同域的其它Flash影片用以下程序來讀取:
var example:SharedObject = SharedObject.getLocal("example", "/");
再看一個例子:
有兩個Flash影片movieOne.swf和movieTwo.swf都位於同一域(http://www.riahome.cn)內,但是, movieOne.swf位於http://www.riahome.cn/youthoy/firstGroup,而movieTwo.swf位於 http://www.riahome.cn/youthoy/secondGroup.在這情況裏,movieOne.swf可以用下列任何本地路徑建 立和讀取LSO:
/
/youthoy
/youthoy/firstGroup
而movieTwo.swf可以用下列任何本地路徑建立和讀取LSO:
/
/youthoy
/youthoy/secondGroup
因此,如果你想要兩個影片都可以讀取相同LSO,當你調用getLocal()方法時,必須指定影片共享的兩個本地路徑之一(/或/youthoy).

【URLLoader.dataFormat的三種類型】
URLLoader.dataFormat的可選值是:
flash.net.URLLoaderDataFormat.BINARY
flash.net.URLLoaderDataFormat.TEXT
flash.net.URLLoaderDataFormat.VARIABLES
當dataFormat是BINARY時,URLLoader.data屬性就是flash.utils.ByteArray類型;
當dataFormat是TEXT時,URLLoader.data屬性就是String類型;
當dataFormat是VARIABLES時,uRLLoader.data屬性就是Object類型.

【在XML內使用動態數據】
把變量放在大括號({和})內:
var userName:String = "Youthoy";
var myXML:XML = <person><userName>{userName}</userName></person>;

【新增一個節點元素】
//例子一:
var example:XML = <person/>;
example.father = <father/>; //內容屬性和元素名稱不一定要相同,也可以: example.abc = <father/>,但會以元素名稱爲準,即會建立一個<father/>元素
trace(example);
/*
輸出:
<person>
  <father/>
</person>
*/
//例子二:
var example:XML = <person/>;
example.father = ""; //建立一個<father/>元素
trace(example.toString());
/*
輸出:
<person>
  <father/>
</person>
*/
//例子三:
var example:XML = <person/>;
var id:int = 10;
example["user" + id] = "";
trace(example);
/*
輸出:
<person>
  <user10/>
</person>
注意: 有些情況必須使用第三種情況.例如,元素節點名稱內含連字符("-")是完全合法的,但在ActionScript裏會得到編譯器錯誤:
example.some-element = ""; //產生編譯器錯誤
正確的寫法是:
example["some-element"] = "";
*/

【新增屬性】
var example:XML = <person/>;
example.element = "";
example.element.@name = "Youthoy";
example.element.@["bad-variable-name"] = "yes";
example.element.@other = ["riahome.cn", undefined, true, 44, null];
var id:int = 44;
example.element.@["user" + id] = "love";
trace(example);
/*
輸出:
<person>
  <element name="Youthoy" bad-variable-name="yes" other="riahome.cn,,true,44," user44="love"/>
</person>
*/

【向XML插入文字元素和節點元素】
//在指定元素前和後插入,在最前端和尾端插入
var example:XML = <person/>;
example.two = "";
example.insertChildBefore(example.two, <one/>); //在two節點前插入one節點
example.insertChildBefore(example.two, "在two節點前插入文字");
example.insertChildAfter(example.two, <three/>); //在two節點後插入three節點
example.prependChild(<start/>); //在最頂端插入start節點
example.appendChild(<end/>); //在尾端插入end節點
example.start = "start內容"; //向節點增加內容
trace(example);
/*
輸出:
<person>
  <start>start內容</start>
  <one/>
  在two節點前插入文字
  <two/>
  <three/>
  <end/>
</person>
*/

【把XML實例的內容屬性轉換爲任何可以轉換成字符串的內容】
//先把等號右邊轉爲可以轉換的字符串
var example:XML = <person/>;
example.one = "one";
example.two = new URLLoader();
example.three = new Sprite();
example.four = new Boolean; //Boolean對象的值初始化爲false
example.five = new Number();
example.six = new String();
example.seven = {a:"Youthoy", b:true, c:undefined};
example.eight = ["three", undefined, true, 44, null];
/*
輸出:
<person>
  <one>one</one>
  <two>[object URLLoader]</two>
  <three>[object Sprite]</three>
  <four>false</four>
  <five>0</five>
  <six/>
  <seven>[object Object]</seven>
  <eight>three,,true,44,</eight>
</person>
*/

【對XML屬性層層遞歸的算法】
var example:XML = <menu>
                    <menuitem label="File">
                      <menuitem label="New"/>
                      <menuitem label="Save"/>
                    </menuitem>
                    <menuitem label="Help">
                      <menuitem label="About"/>
                    </menuitem>
                  </menu>;
walk(example);
function walk(node:XML):void {
for each(var element:XML in node.elements()) {
    trace(element.@label);
    walk(element);
}

【讀取文字節點及其值】
var example:XML = <menu>
                    My name is Youthoy.
                    <myName>Youthoy</myName>
                  </menu>;
example.text(); //輸出: My name is Youthoy.
example.myName.toXMLString(); //輸出: <myName>Youthoy</myName>
//以下三行都輸出: Youthoy
example.myName.toString();
example.myName.text();
example.myName;

【遞歸元素屬性時讀取屬性名與其值】
var example:XML = <person name="Youthoy" age="21"/>;
    for each(var i:XML in example.attributes()) {
    trace(i.name() + "=" + i);
}
/*
輸出:
name=Youthoy
age=21
*/
另類方法:
var example:XML = <person name="Youthoy" age="21"/>;
trace(example.@*[1]); //輸出: 21

【不論層級地訪問整個XML中指定的節點或屬性】
使用後代存取器運算符..
例子1(對於節點元素):
var example:XML = <a>
                    <z>I am z.</z>
                    <b>
                     <c></c>
                     <z>I am z.</z>
                   </b>
                 </a>;
trace(example..z.text()); //輸出: I am z.I am z.
例子2(對於屬性):
var example:XML = <person>
                    <a>
                      <item name="Youthoy" age="21"/>
                    </a>
                    <item name="Jimpa" age="21"/>
                  </person>
trace(example..@name); //輸出: YouthoyJimpa

【刪除節點元素,文字節點以及屬性】
使用delete對單一項進行刪除,要刪除整個XMLList可以使用for循環以倒序形式進行刪除,以避免迭代時需要改變數組索引問題.

【搜索XML的高級應用】
使用術語過濾.(condition),可結合正則表達式來使用.
例子:
var example:XML = <foodgroup>
<fruits>
  <fruit color="red">Apple</fruit>
    <fruit color="orange">Orange</fruit>
    <fruit color="green">Pear</fruit>
    <fruit color="red">Watermelon</fruit>
  </fruits>
  <vegetables>
    <vegetable color="red">Tomato</vegetable>
    <vegetable color="brown">Potato</vegetable>
    <vegetable color="green">Broccoli</vegetable>
  </vegetables>
</foodgroup>;
trace(example..*.(hasOwnProperty("@color") && @color == "red"));
/*
hasOwnProperty所做的檢測是確保元素具有color屬性,然後,有的話,就測試color屬性之值是否爲red.只有當條件的計算結果爲true時,該元素纔會加入EX4運算式所返回的XMLList.
輸出
<fruit color="red">Apple</fruit>
<fruit color="red">Watermelon</fruit>
<vegetable color="red">Tomato</vegetable>
*/

【CDATA(Character Data)標籤】
<![CDATA[]]>,必須大寫.如果<![CDATA[[]]]>這樣的話,它會告訴你語法錯誤的.

【一些名詞】
RPC:
全稱: Remote Procedure Call,臺灣的朋友稱其爲: 遠端程序呼叫
SOAP:
全稱: Simple Object Access Protocol,臺灣的朋友稱其爲: 簡單物體存取協定
WSDL:
全稱: Web Service Description Language,臺灣的朋友稱其爲: web service描述語言

 
發佈了108 篇原創文章 · 獲贊 24 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章