天天看點

常用事件方法及技巧(二) -- MouseEvent(滑鼠事件)

      先說明一下,我并不會把所有的内容都寫出來,隻列我認為有必要講解一下的内容。如果要了解全部内容,請參看Flash自帶的幫助檔案。該系列文章都是按照這個思路寫的。

      先說一個本人覺得很實用的通用方法:toString()。基本上所有的事件都帶有這個方法,不肯定的時候就trace(event.toString())看一下,會發現内容比幫助文檔還要全。囧一個。

      下面進入正題,今天講的是MouseEvent(滑鼠事件)。

      一、MOUSE_OVER、MOUSE_OUT和ROLL_OVER、ROLL_OUT的差別是什麼?

      唯一的差別就是:MOUSE_OVER、MOUSE_OUT采用的是冒泡機制;而ROLL_OVER、ROLL_OUT采用的是非冒泡機制(關于冒泡機制的講解請詳細看我上一篇文章)。是以如果你非常習慣AS2程式設計,可以使用ROLL_OVER、ROLL_OUT,和原來的沒什麼差別。但我建議你還是習慣冒泡機制,畢竟這個是AS3的指導方向。

      同時,MouseEvent的事件中,也隻有ROLL_OVER、ROLL_OUT這兩個采取的還是非冒泡機制。

      下面我給出一個比較差別的例子,但不做很具體的說明了:

      如圖所示,整個圖形是一個MC,執行個體名為t1。裡面的粉紅色框為t1内的一個MC,執行個體名為t2。

       (1) 在第一幀寫入代碼,給兩個MC都增加偵聽如下:

      function p1(event:MouseEvent):void

      {

          trace("t1");

      }

      t1.addEventListener(MouseEvent.ROLL_OUT, p1);

      function p2(event:MouseEvent):void

          trace("t2");

      t1.t2.addEventListener(MouseEvent.ROLL_OUT, p2);

      編譯該段代碼,當滑鼠從最左邊沿中間移動,最終從右邊移出。螢幕輸出:

      t2

      t1

      (2)代碼還是上面,僅僅是把MouseEvent.ROLL_OUT修改為MouseEvent.MOUSE_OUT,編譯後同樣操作,螢幕輸出:

      說明ROLL_OUT采取的是非冒泡機制,而MOUSE_OUT采取的是冒泡機制。

       二、令人困惑的DOUBLE_CLICK:滑鼠輕按兩下動作

      這個動作在AS2.0是沒有的,屬于AS3.0新加的事件。但是在使用的過程中,卻有不少的麻煩問題,讓我們一步步分析:

      (1)  預設是關閉的,必須手動打開。

      我們在舞台上建立一個MC,執行個體名為t1,在第一幀寫入代碼如下:

      t1.addEventListener(MouseEvent.DOUBLE_CLICK, p1);

      運作後,發現無效。為什麼呢?因為t1沒有打開支援滑鼠輕按兩下,需要在第一行添加代碼如下:  t1.doubleClickEnabled = true;現在再運作,可以了吧?

      但這個用法和大多的事件是很不相同的。

      (2)  我們在t1内再建立一個MC,執行個體名為t2,然後再運作上述代碼。

      問題出現了,在新建立的MC區域,DOUBLE_CLICK事件不響應了。

      為什麼會發生這樣的事情呢?難道因為新建立的t2,doubleClickEnabled為false,是以t1的輕按兩下冒泡事件受到t2的影響,冒不出來了嗎?...囧

      為證明并解決這個問題,我在第二行寫入代碼如下:

      t1.t2.doubleClickEnabled = true;

      運作後,果然,問題排除。

      可有人要問了,那如果我的MC裡面包含了許多子MC怎麼辦?難道要一個個打開?

      那倒也不用那麼麻煩,加入下面的代碼即可:

      t1.mouseChildren = false;  //t1的子項不支援滑鼠動作

      但這個給人的感覺就像是打一個更新檔...

      (3) 詭異的冒泡事件

      我們把代碼稍稍修改下,如下所示:

      trace(t1.doubleClickEnabled)

      t1.t2.addEventListener(MouseEvent.DOUBLE_CLICK, p2);

      運作後,第二行的trace傳回的結果是false,說明t1的輕按兩下屬性沒有打開。

      然後我們在t2區域上方輕按兩下滑鼠,靈異事件發生了!下面的2個函數均被觸發了!

      依次傳回t2,t1。

      這個究竟是怎麼回事呢?我隻好從說明上找根源,然後看到這麼一段官方說明:“要使 doubleClick 事件發生,它必在以下一系列事件後面:mouseDown、mouseUp、click、mouseDown、mouseUp。 所有這些事件必須共享與 doubleClick 事件相同的目标。”

      難道說,是因為DOUBLE_CLICK是由那5個事件組成,而打開t1.t2.doubleClickEnabled,相當于把t2所在區域的限制打開,導緻處于該區域範圍的t1也無效了嗎?

      總之,感覺AS3的滑鼠輕按兩下事件,隻是為了解決AS2沒有該事件而做的一個半成品,并不能真正意義上稱其為一個獨立的事件。

      以上!

本文轉自 windtoto 51CTO部落格,原文連結:http://blog.51cto.com/windtoto/372515,如需轉載請自行聯系原作者

繼續閱讀