天天看點

關于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 >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);

//例子二:

var example:XML = <person/>;

example.father = ""; //建立一個<father/>元素

trace(example.toString());

//例子三:

var example:XML = <person/>;

var id:int = 10;

example["user" + id] = "";

trace(example);

【新增屬性】

var example:XML = <person/>;

example.element = "";

[email protected] = "Youthoy";

example.element.@["bad-variable-name"] = "yes";

exa[email protected] = ["riahome.cn", undefined, true, 44, null];

var id:int = 44;

example.element.@["user" + id] = "love";

trace(example);

【向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);

【把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];

【對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([email protected]);

    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);

}

另類方法:

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([email protected]); //輸出: 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"));

【CDATA(Character Data)标簽】

<![CDATA[]]>,必須大寫.如果<![CDATA[[]]]>這樣的話,它會告訴你文法錯誤的.

【一些名詞】

RPC:

全稱: Remote Procedure Call,台灣的朋友稱其為: 遠端程式呼叫

SOAP:

全稱: Simple Object Access Protocol,台灣的朋友稱其為: 簡單物體存取協定

WSDL:

全稱: Web Service Description Language,台灣的朋友稱其為: web service描述語言