2010年6月12日 星期六

AcionScript 3 筆記(2)

這篇還是以會用到的ActionScript作介紹
提到的有
1.結合陣列和函式
2.function接受不定數量參數寫法
3.使用getChildByName()函式取得元件
4.動態設定元件屬性

1.結合陣列和函式

ActionScript 3 可以將陣列與函式搭配使用

範例程式碼:
var name:Array = ["Joe", "Jon", "Jay"];
name.foreach(showName);

function showName(element:*, index:int, array:Array){
  trace("第" + index + "號的名字是" + element);
}

上述程式的element是表示元素的值,index就是...index嘛,最後的Array是傳進來的array
使用這種寫法就會自動的將參數以上面的方式輸入函式裡
另外以下的使用方法也可以參考:
....//與上述程式碼相同

function showName(element:*, index:int, array:Array){
  //add ", " after elements 
  array[index] = element + ", ";
}
trace("名單有"+name + "以及其他人");

輸出結果會是經過改變的陣列內容

類似的處理還有map、filter、every、some方法

map範例:

var score:Array = [1, 2, 3];
var message:Array = score.map(addString);


function addString(element:*, index:int, array:Array){
 return element + "分";

}
trace("score 是" + score);
trace("message 是" +message);

map與foreach方法的差別在於它具有回傳值

filter範例:
var num:Array = {1,2,3,4,5,6};
var evenList:Array = num.filter(isEven);

function isEven(element:*, index:int, array:Array):Boolean{
   return element%2 == 0;
}
trace("偶數有" + evenList);

filter回傳的會是在判斷式裡是true的值,也就是  "偶數有2,4,6"
every、some的寫法類似filter,但這兩個回傳Boolean值
分別是對整體Array或部分Array作判斷
例如num.every(isEven); //回傳false,因為數列並不全為偶數

2.function接受不定數量參數寫法

這個部分在Java裡有類似的寫法,處理方式也差不多
範例:
function getDishes(plate:String, ...dishList:Array){
  var  dishes:String = dishList.join("、");
  trace(plate + "有" + dishes);
}

getDishes("盒子裡有", "香腸", "空心菜", "炒麵");
不定量參數一定要放在最後面,並且只能用Array形別

3.使用getChildByName()函式取得元件

看到這個名稱就很容易想到 javascript 取得元件的寫法
在Flex裡整個mxml檔案內的元件配置也是呈現DOM階層式
mxml裡的Application標籤宣告即是一個節點
每個節點在執行期都等同於instance實體物件
實際上Flex還會再另外建立一個stage節點於Application上
stage位於整個結構的頂點,可以控制整個Application版面的配置
而這個getChildByName()函式使用方法如下:
 this.getChildByName('a');

它會在整個階層架構中尋找名為a的元件
並將其以DisplayObject的型態回傳

4.動態設定元件屬性 

程式範例:
            public function setAttributeByName(uiIns:UIComponent,aName:String):void {
                // 將物件Class-類別宣告轉成XML資料格式
                 var classInfo:XML = describeType(uiIns);
                // 走訪XML中描述物件中所有的屬性
                for each (var attr:XML in classInfo..accessor) {
                    //過濾如果屬性型態不是writeonly,也就是篩選出可讀寫的屬性
                    if (attr.@access != 'writeonly') {
                        if (attr.@name==aName) {
                            //以Associative array key的方式設定Instance的屬性
                            uiIns[attr.@name]=100;
                        }   
                    }
                }
            }

程式會走訪XML中所有accessor節點並放入attr變數中
假使內容如同傳進來的aName變數
這個function會將指定的屬性設定成100

另外將accessor改換成method,則可以走訪物件資料中的method資料
程式範例:
        public function callMethodByName(uiIns:UIComponent,mName:String):void {
             //用陣列設定傳遞給方法中參數的值,請參考setVisible方法的參數格式
             var args:Array=[false,false];
              var classInfo:XML = describeType(uiIns);
             // 走訪XML中描述物件中所有的方法
             for each (var meth:XML in classInfo..method){
                 if (meth.@name==mName){
                     //以Associative array key的機制動態取得Instance的方法
                     //運用apply方法動態invoke被指定方法與傳遞參數
                     uiIns[mName].apply(uiIns, args);
                    }   
                }
            }

這個範例可以做到動態呼叫元件的函式

沒有留言:

張貼留言