天天看點

自定義事件和自定義事件類

正确區分自定義事件和自定義事件類,如果你隻是簡單地發送一個你自己的事件而不需要更多資訊,可以使用

<code></code>

<code></code><code>var myinfo:event=new event("myownevent"); dispatchevent(myinfo)</code>

<code> </code>

來實作,我們看到自定義事件很簡單,隻需給event類傳入一個特殊的不與内置事件類型重複的字元串即可。

    可以做如下測試:

自定義事件和自定義事件類
自定義事件和自定義事件類

代碼

//outer

var outer = new sprite();

outer.name="outer";

outer.graphics.beginfill(0xff0000);

outer.graphics.drawrect(0,0,100,100);

//mid

var mid = new sprite();

mid.name="mid"

mid.graphics.beginfill(0x00ff00);

mid.graphics.drawrect(0,0,50,50);

//inner

var inner = new sprite();

inner.name="inner";

inner.graphics.beginfill(0x0000ff);

inner.graphics.drawrect(0,0,25,25);

//addchild

outer.addchild(mid);

mid.addchild(inner);

addchild(outer);

outer.x=outer.y=100;

//添加偵聽器

outer.addeventlistener("myownevent",myowneventhandler,true);//注意此處将usecapture設為true是以會在捕獲階段調用偵聽器

mid.addeventlistener("myownevent",myowneventhandler,true);//同上

inner.addeventlistener("myownevent",myowneventhandler);

function myowneventhandler(evt){

        trace("事件流目前階段:"+evt.eventphase)

        trace("滑鼠點選處最内層的顯示對象(target)是:" + evt.target.name)

        trace("事件目前流經顯示對象(currenttarget)是:"+evt.currenttarget.name)

        trace("===============================================================")

}

var myinfo=new event("myownevent")

inner.dispatchevent(myinfo)//由inner向flashplayer提出請求把一個myownevent的事件對象加入事件流

輸出:

<code>事件流目前階段:1 滑鼠點選處最内層的顯示對象(target)是:inner 事件目前流經顯示對象(currenttarget)是:outer =============================================================== 事件流目前階段:1 滑鼠點選處最内層的顯示對象(target)是:inner 事件目前流經顯示對象(currenttarget)是:mid =============================================================== 事件流目前階段:2 滑鼠點選處最内層的顯示對象(target)是:inner 事件目前流經顯示對象(currenttarget)是:inner ===============================================================</code>可以看到我們自定義的事件被加入到了事件流中并且被outer,mid,inner收到了

這裡要補充一點,dispatchevnet的調用對象将會被作為事件的目标對象(target)

暈了沒?

你可以修改一下上面的代碼來幫助你了解

trace(myinfo.target)//輸出調用dispatchevent方法前的target的名字,輸出結果是null

inner.dispatchevent(myinfo)

trace(myinfo.target.name)//輸出調用dispatchevent方法前的target的名字,輸出結果是inner

如果你認真看完了上面的文字,你應該對自定義事件有了一定了解,在一般情況下,這種方法已經夠用了,如果你還需要更複雜的事件的話,你就可以考慮建立你自己的事件類了

編寫自己的事件類

   在上面的mp3播放器例子中我們提到了給mp3播放控制部分發送一個progresschangeevent事件,現在繼續

   給它發送這個事件的目标是要讓它知道播放進度改變了,還要讓它知道進度變成了多少,這就是參數progressbar.progress的作用

自定義事件類

自定義事件和自定義事件類
自定義事件和自定義事件類

package

{

    import flash.events.event;

    public class progresschangeevent extends event

    {

        static private const progress_change = "progresschange"; //是不是跟mouseevent.mouse_down長得很像,其實mouseevent差不多也是這麼寫出來的

        public var position:number = 0; //這是我們新加的變量,用來存儲進度資訊。

        public function progresschangeevent(pos:numbre)

        {

            super(progress_change); //調用父類的構造函數,将progress_change設定為預設事件類型

            position = pos;

        }

        public override function clone():event //你應負責任地重寫clone方法

            var cloneevent = new progressevent();

            cloneevent.position = this.position;

            return cloneevent;

        public override function tostring():string //你應負責任地重寫tostrin方法

            return formattostring("progresschangeevent", "type", "bubbles", "cancelable", "eventphase", "position");

    }

一個修秀的程式員應該在自定義類中重寫clone和tostring方法,不論你是否會用到這兩個方法!!因為在調用dispatchevent(myinfo)時實際是把myinfo對象的一個拷貝給了dispatchevent方法。

-_-!!終于寫完了,現在我們可以使用自己寫的事件類了。

把上面的代碼儲存成progresschangeevent.as檔案,然後在同一目錄下建立一個fla檔案f9打開動作面闆輸入:

代碼:

自定義事件和自定義事件類
自定義事件和自定義事件類

import progresschangeevent//其實可以省略,因為在同一目錄下

//playercontralcenter

var playercontralcenter=new sprite();

playercontralcenter.name="playercontralcenter"

playercontralcenter.graphics.beginfill(0x00ff00);

playercontralcenter.graphics.drawrect(0,0,100,100);

//progressbar

var progressbar=new sprite();

progressbar.name="progressbar"

progressbar.graphics.beginfill(0xff0000);

progressbar.graphics.drawrect(0,0,100,5);

playercontralcenter.addchild(progressbar);

addchild(playercontralcenter);

progressbar.y=50

playercontralcenter.x=playercontralcenter.y=100

//playercontralcenter偵聽progresschangeevent事件,将usecapture設定為true的原因是我們的自定義事件類是不冒泡的(你也可以修改成可冒泡的),是以必須在捕獲階段響應

playercontralcenter.addeventlistener(progresschangeevent.progress_change,handler,true);

progressbar.addeventlistener(mouseevent.mouse_down,mousedownhandler);

function handler(evt:progresschangeevent){

    trace("我是"+evt.currenttarget.name+",我收到了"+evt.type+"事件,"+"事件資訊是"+evt.position);

function mousedownhandler(evt:mouseevent){

        var pos=evt.target.mousex/evt.target.width;

    progressbar.dispatchevent(new progresschangeevent(pos));

<code>我是playercontralcenter,我收到了progresschange事件,事件資訊是0.42 我是playercontralcenter,我收到了progresschange事件,事件資訊是0.84 我是playercontralcenter,我收到了progresschange事件,事件資訊是0.94 我是playercontralcenter,我收到了progresschange事件,事件資訊是0.97 我是playercontralcenter,我收到了progresschange事件,事件資訊是0.05 .............</code>