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