天天看點

AS3 自定義事件

結構:

1.自定義事件(Event類或其子類執行個體)

2.事件發送者(必須EventDispatcher類或其子類執行個體)

3.事件監聽器(接收事件後執行特定處理代碼)

監聽事件:

1.建立監聽器,監聽器可為獨立的函數或某對象的方法

2.注冊監聽,使用事件發送者的addEventListener()注冊自定義事件(Event類或其子類執行個體),事件監聽器(接收事件後執行特定處理代碼)

事件監聽器:

必須是函數,必須隻有一個參數(必須是Event類或子類執行個體),傳回值必須為空。

function listenerName(evt:Event):void{...}

//定義點菜事件

package lu.huang.event{

import flash.events.Event;

//繼承Event類

public class OrderEvent extends Event{

//自定義事件類型

public static const ORDER_DISHES:String = "點菜";

//自定義事件包含參數(此處為菜單)

private var _dishes:Array;

//構造函數

public function OrderEvent(){

//調用父類構造函數初始化對象

super(ORDER_DISHES);

}

//getter,setter設定菜單值

public function get dishes():Array{

return _dishes;

}

public function set dishes(dishesAry:Array):void{

_dishes = dishesAry;

}

//重寫父類toString方法,輸出類的屬性

override public function toString():String{

return formatToString("OrderEvent", "type", "bubbles", "cancelable", "eventPhase", "dishes");

}

//重寫父類clone實作自定義事件的複制

override public function clone():Event{

var tmpEvt:OrderEvent = new OrderEvent();

tmpEvt._dishes = _dishes;

return tmpEvt;

}

}

}

//顧客類(事件發送者)

package lu.huang{

import flash.events.EventDispatcher;

//包含自定義點菜事件類

import lu.huang.event.OrderEvent;

//繼承EventDispatcher類

public class Customer extends EventDispatcher{

//顧客的名稱

public var name:String;

//構造函數

public function Customer(nS:String){

name = nS;

}

//顧客點菜

public function order():void{

//執行個體化點菜事件

var orderDish:OrderEvent = new OrderEvent();

//點菜放入點菜事件

orderDish.dishes = [//'剁椒魚頭','農家小炒肉'];

//發送點菜事件

dispatchEvent(orderDish);

}

}

}

//服務員類(事件監聽器)

package lu.huang{

//包含自定義點菜事件類

import lu.huang.event.OrderEvent;

public class Waiter{

//顧客發出點菜事件後服務員響應事件處理

public function replyOrderFood(evt:OrderEvent):void{

trace("你好," + evt.target.name + "!你點的菜是:/r" + evt.dishes);

trace("我馬上吩咐廚房去做!");

}

}

}

調用:

//執行個體化一個顧客對象

var lulu:Customer = new Customer("lulu");

//執行個體化一個服務員對象

var waiter:Waiter = new Waiter();

//為lulu添加一事件監聽(事件類型,監聽器(處理方法))

lulu.addEventListener(OrderEvent.ORDER_DISHES,waiter.replyOrderFood);

//觸發點菜事件,完成點菜

lulu.order();

//移除監聽

lulu.removeEventListener(OrderEvent.ORDER_DISHES,waiter.replyOrderFood);