[Flash] Event Dispatching

  • Event Dispatching
  • Download: Reminder.zip

    在比較複雜一點的開發專案裡就比較常用到Event Dispatching,因為並不是所有的物件都可以加到Timeline上(未必繼承於Sprite),這時dispatchEvent就派上用場。

    舉個例子來說,假設我們今天要設計一個Reminder,當Reminder時間一到就顯示當初設定的訊息。比較笨的做法就是不斷的去測試Reminder的物件裡的時間是否已經Timeout,然後再顯示設定的訊息,但我想應該沒有人會這樣做。因為在Reminder裡面是使用Timer來計算時間,所以就直接使用TimerEvent.COMPLETE,當Timer結束時在主場景上顯示設定的訊息,要達到這個條件 ,Reminder必須跟主要顯示物件是繼承或者是parent/child的關係,如此才能控制parent的functions以及properties。或者你也可以在Reminder裡面新增TextField之類的物件,只是這樣的話顯示訊息的UI就被鎖死在Reminder裡,所以這種方式還是不夠好,為了讓Reminder就是專心做計時並且回傳當初設定的訊息,下面就是使用dispatchEvent來實做的方法。

    /* Reminder */
    package{
    import flash.events.TimerEvent;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.EventDispatcher;

    public class Reminder extends EventDispatcher{
    private var timer:Timer;
    private var msg:String;
    public function Reminder(minsec:uint, msg:String){
    this.msg = msg;
    timer = new Timer(minsec,1);
    timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
    timer.start();
    }

    public function get message():String{
    return msg;
    }

    private function onTimerComplete(event:TimerEvent):void{
    dispatchEvent(new Event("onTimeOut"));
    }
    }
    }

    這個範例裡設定的dispatchEvent名稱為onTimeOut,在ReminderDemo裡面要用到。(如果你想讓Reminder裡顯示一些資訊,可以將原本繼承於EventDispatcher改為Sprite,如此在ReminderDemo裡就可以將reminder加入為child。(因為ReminderDemo是繼承於Sprite),但是如前面所提,我們不希望Reminder本身做那麼多事情。)

    /* ReminderDemo */
    package{
    import flash.display.Sprite;
    import flash.events.Event;
    import Reminder;

    public class ReminderDemo extends Sprite{
    private var reminder:Reminder;
    public function ReminderDemo(){
    reminder = new Reminder(1000," event dispatched by remainder! ");
    reminder.addEventListener("onTimeOut", onTimeOut);
    }

    private function onTimeOut(event:Event):void{
    trace(event.target.message);
    }
    }
    }

    Reminder物件經過dispatchEvent之後就多了一個onTimeOut可以設定,我刻意在Reminder裡面將msg設定為read-only,如此我們就可以接收到當初設定的訊息(假使你要一次開啟很多的Reminder時,這樣的寫法應該會比較便捷)。

    有了Event Dispatching的功能之後,在OOP裡會更方便許多。

    P.S. 如果你熟悉flash.utils這個package,你應該會發現有一個叫做setTimeout可以用,但是在AS3裡,Adobe建議我們使用Timer來完成TimeOut的功能(我想他們可能很想把setInterval/setTimeout給拿掉。)

No comments:

Post a Comment

Orange - data analysis tool

Installation pip install orange3 Run orange python -m Orange.canvas