天天看點

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

  事件可以了解為所發生的、ActionScript 能夠識别并可響應的事情。許多事件與使用者互動有關 . 例如:使用者單擊按鈕,或按鍵盤上的鍵 ― 但也有其它類型的事件。例如,如果使用 ActionScript 加載外部圖像,有一個事件可讓您知道圖像何時加載完畢。本質上,當 ActionScript 程式正在運作時,Adobe Flash Player 隻是坐等某些事情的發生,當這些事情發生時,Flash Player 将運作您為這些事件指定的特定 ActionScript 代碼。

  ActionScript 3.0中的事件模型和Java的AWT事件模型非常的相似,很久前我也寫過一篇與Java的事件模型相關的文章《談愛情故事,談觀察者模式》,有興趣的朋友可以去看看。在ActionScript 3.0中提供了很多種事件類型,用得最多得則是滑鼠和鍵盤相關的事件,本文主要介紹滑鼠的事件和ActionScript 3.0中的事件模型。

一、從點選按扭認識事件

  大家都知道,在開發ASP.NET應用的時候,我們要執行某一操作,可以将代碼寫在按扭的click事件下,在運作程式的時候通過點選按扭便會觸發事件執行下面的程式代碼。在ActionScript 中同樣如此,我們也可以設定按扭的click事件,将點選按扭後要執行的程式代碼下在事件函數下面。如在本系列第一篇文章中的“Hello World”示例:

1       < mx:Button x = " 24 "  y = " 35 "  label = " 點 我 "  id = " btnClick "  

2          height = " 34 "  width = " 63 "  fontSize = " 14 "  

3          click = " OnClick() " />

     如上代碼片段,設定了按扭的click事件的執行函數為OnClick()方法,下面為OnClick的定義: 1       internal  function OnClick(): void  {

2          txt.text = " Hello World! " ;

3      }

     衆所周知,在.NET裡做開發,我們出了直接通過執行按扭的Button_OnClick事件,也可以不觸發OnClick屬性,通過委托的方式("+=")給按扭附加一個事件處理函數.在ActionScript 3.0中同樣可以怎麼來處理,隻是實作上有所不同,它同Java一樣,是通過事件監聽來完成的,也就是直接給按扭添加一個事件監聽函數,如下代碼塊:

1  // 給btnClick按鈕添加一個滑鼠事件監聽函數OnClick

2  btnClick.addEventListener(MouseEvent.CLICK,OnClick);

4  ------------------------------------------------------

5  private  function OnClick(evt:MouseEvent): void  {

6      result.text = " 你點了按扭 " ;

7  }

     由上面代碼塊可以看出,是通過addEventListener()方法給按鈕添加了一個事件監聽函數,那麼相反的則是登出監聽,使用removeEventListener()方法來完成。

     按鈕的滑鼠事件有很多中,上面示範了單擊事件MouseEvent.CLICK,出了它還有下面幾種,如圖所示:

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

     這裡需要注意的一點,給按鈕添加事件監聽函數的時候,這個函數的定義需要一個滑鼠事件類型的參數,見上面單擊事件(Click)所添加的事件監聽方法(OnClick)的定義。

二、ActionScript 3.0的事件體系

     ActionScript 3.0作為一門面向對象的開發語言,同C#/java一樣一切皆對象,萬物皆從 Object開始。其事件模型那肯定也不例外了,詳細見下事件類繼承圖:

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

     上圖概括了整個ActionScript 3.0的完整的事件體系,裡面的詳細這裡就不作介紹,在後續的文章裡将會一步一步的涉及到這些内容,詳細請關注後續文章的詳細介紹。

三、事件流和事件對象

     事件流和事件對象是事件中非常重要的兩個概念,下面是官方的解說:

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

 事件流 (Event Flow):如果顯示清單中的對象(螢幕上顯示的對象)發生事件,則會向包含該對象的所有對象通知此事件,并依次通知其事件偵聽器。此過程從舞台開始,并在顯示清單中一直進行到發生事件的實際對象,然後再傳回到舞台。此過程稱為事件流。

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

 事件對象 (Event Object):此對象包含發生的特定事件的相關資訊,當排程事件時,此資訊将被發送到所有偵聽器。

     雖然在ActionScript 3.0中相比 2.0有很大的改進,所謂萬變不離其本,事件流同樣還是分為三大階段:捕獲事件階段、目标階段和冒泡階段。請參考下圖:

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始
ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

 捕獲階段:從根節點到子節點,檢測對象是否注冊了事件監聽函數,是則調用監聽函數。

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

 目标階段:調用目标對象本身注冊的監聽程式。

ActionScript 3.0 Step By Step系列(六):學對象事件模型,從點選按扭開始

 冒泡階段:從目标節點到根節點,檢測對象是否注冊了事件監聽函數,是則調用監聽函數。

   注整個事件流階段從某中角度來說也可以了解為請求--處理--響應的方式。

     事件對象主要有兩個作用:第一,事件對象通過将特定事件的資訊存儲在一組屬性中,來代表實際事件。第二,事件對象包含一組方法,可用于操作事件對象和影響事件處理系統的行為。如C#語言一樣,ActionScript 3.0 中Flash Player API也定義了一個Event事件類做為所有事件的基類,Event 類定義一組基本的适用于所有事件對象的屬性和方法。當發生事件時,Event對象将作為參數傳遞給事件監聽器。

     這作為了解便是,在實際程式設計中用得不是很多,其用法和C#/Java一樣。這裡就不做詳細介紹,隻需要記住下面兩個重要的方法便OK。

     1、evt.stopImmediatePropagtion():void 防止對事件流中目前節點中和所有後續節點中的事件偵聽器進行處理。 

     2、evt.stopPropagetion():void 防止對事件流中目前節點的後續節點中的所有事件偵聽器進行處理。

四、建立自定義事件

     上面已經介紹Event做為所有事件的基類,那麼建立一個自定義的事件肯定離不開它,需要繼承事件基類Event。

      建立自定義事件說難又不難,說簡單也非簡單,具體需要根據實際需求而定,在這裡一時半會也講不清楚。在ActionScrip 3.0中要建立自定義事件和步驟和C#/Java是差不多的,原理都是一樣,是以這裡我就不做過多的介紹,詳細大家可以檢視相關書籍或官方提供的相關文擋。

注:原創文章歡迎轉載,本文版權歸作者和部落格園共有,轉載務必注明文章出處。  

     作     者:Beniao

     文章出處:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/