大家好,今天亦樂首次為大家?guī)韋lash actionscript轉(zhuǎn)載教程。首先聲明出處(我自己是沒時間寫教程啦,要直接找我討論還好)
今天,我也正式宣布,開始成為閃客,以往對macromedia flash的許多頭疼問題都被adobe解決了,以往一直否認(rèn)我喜歡做flash,現(xiàn)在總算可以為adobe flash 自豪。非常有系統(tǒng)的developing方式。RIA 平臺, on screen project就不這里說了。
這期帶來的是flash極重要元素之一,event事件。在游戲里就是所謂的Trigger. Adobe改良后的,大家謂稱的“冒泡機(jī)制”。有問題歡迎發(fā)問指教。
=思路大綱=
- ActionScript 2的問題
- AS3解決問題
- 結(jié)合問題,說明“冒泡”
- 冒泡的問題所在以及解決方法
1 - ActionScript 2的問題
stage里有一個mc,mc里有一個btn
點選mc實現(xiàn)拖動mc,鼠標(biāo)松開停止拖動
點選mc實現(xiàn)mc隱藏。
最容易想到的方法,代碼如下:
mc.onPress = function() {
this.startDrag();
};
mc.onRelease = function() {
this.stopDrag();
};
mc.btn.onPress = function() {
mc._visible=false
};
表面來看,這個思路是正確的。(實際上沒什么思路可言,很簡單的方法。)
實際怎么樣?當(dāng)然是不能實現(xiàn)。
問題:點擊btn,不能觸發(fā)btn的動作!!!!
解釋: 因為btn處于mc內(nèi)部,mc被加上了事件以后,按照as2的事件機(jī)制,mc內(nèi)部的btn甚至是其他的元件都不能接受事件。或者可以認(rèn)為mc的事件覆蓋了mc中其他元件的事件。
從非冒泡機(jī)制來說,在btn上點擊鼠標(biāo),首先接受到點擊事件的自然是btn的上一層(也就是mc),然后才是btn元件。Mc先接受到點擊事件,觸發(fā)相關(guān)的函數(shù)。然后呢?我們要實現(xiàn)的點擊btn的效果沒了。我們可以認(rèn)為mc把我們的鼠標(biāo)點擊事件據(jù)為私有了,不再往下傳遞。(如果是冒泡機(jī)制的話,這個動作就回繼續(xù)往下傳遞到btn,然后btn會執(zhí)行。)那么這種效果在as2中還能實現(xiàn)么?答案自然是肯定的,不過方法就復(fù)雜了。
這里就不討論了。As3已經(jīng)成為主流。
但是as3中的冒泡機(jī)制,讓我們可以簡單的解決這樣的難題。
2 - AS3解決問題
下面來看as3中怎么實現(xiàn)。
代碼如下:
import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
function mcfunction(event:MouseEvent) {
trace("mc click");
}
function btnfucntion(event:MouseEvent) {
trace("btn click");
}
看看代碼就覺得,好像沒用什么特別的解決方法,就加兩個偵聽函數(shù),就搞定了。
這個代碼自然的不能再自然了,就好像做flash 先的安裝軟件一樣。
但是如此自然的代碼下面,使AS3的冒泡機(jī)制在提供支持。
3 - 結(jié)合問題,說明冒泡機(jī)制:
Help中有一個冒泡機(jī)制的圖,相信大家都已經(jīng)看過了
這里我聯(lián)系實例,另外做一個圖,幫助各位理解。

上圖為as2中的執(zhí)行原理
下圖為as3中的執(zhí)行原理
上圖也就是在as3中實現(xiàn)我們文章開始提出的例子的工作原理。
下面詳細(xì)描述一下
捕獲階段:
鼠標(biāo)在btn上發(fā)出點擊事件,首先捕捉到該事件的事stage.,然后事件往下傳遞到mc,再到btn..(如果鼠標(biāo)事件發(fā)生在btn按鈕中的一個label上,那么該事件還會繼續(xù)向下傳遞,直到找到label元件。)AS2中,一旦找到了可以相應(yīng)事件的函數(shù),就停止了,不會往下傳遞。這個道理應(yīng)該說明白了
目標(biāo)階段:
找到我們的鼠標(biāo)最底層的目標(biāo),也就是btn以后,那么就開始執(zhí)行btn的偵聽函數(shù)了。
如果鼠標(biāo)事件發(fā)生的所在位置,是mc中的btn中的一個label。那么將先執(zhí)行l(wèi)abel的偵聽函數(shù)。(當(dāng)然我們的例子中沒有l(wèi)abel)
冒泡階段:
執(zhí)行了目標(biāo)階段的偵聽函數(shù)以后,開始冒泡。
換一個說法是,返回btn的父級元件mc,如果能找到相關(guān)的偵聽函數(shù),那么就執(zhí)行,如果沒有,就繼續(xù)往上冒泡到btn的父級元件mc的父級元件stage。看能不能找到相關(guān)的偵聽函數(shù)。
注意一個:首先執(zhí)行的函數(shù)一定是目標(biāo)對象的偵聽函數(shù)。就像我們上面的例子一樣,點擊btn會先trace(“btn click”),然后冒泡到mc,執(zhí)行trace(“mc click”)..然后繼續(xù)往上,如果stage我們也加一個偵聽函數(shù),執(zhí)行語句,那么還會繼續(xù)執(zhí)行 trace(“stage click”).
到達(dá)stage頂層了,冒泡結(jié)束。
說到這里,各位看官也應(yīng)該明白了as3的冒泡究竟是干什么用的了
4 - 冒泡的問題所在以及解決方法
冒泡也有問題,并不是說它有缺陷,因為出現(xiàn)問題無法避免。
問題在于,
假如在上面的例子中,我們不想在點擊btn冒泡階段中執(zhí)行mc的偵聽函數(shù),我們只想執(zhí)行btn的偵聽函數(shù)。怎么解決?
同樣的問題延伸出去,可以得到很多擴(kuò)展和應(yīng)用。
那么我們需要阻止他的冒泡的時候執(zhí)行相關(guān)的偵聽函數(shù)。
Chm中的方法有
stopImmediatePropagation():void
防止對事件流中當(dāng)前節(jié)點中和所有后續(xù)節(jié)點中的事件偵聽器進(jìn)行處理。
stopPropagation():void
防止對事件流中當(dāng)前節(jié)點的后續(xù)節(jié)點中的所有事件偵聽器進(jìn)行處理。
用來修改我們上面的例子
代碼如下:
import flash.events.*;
mc.addEventListener(MouseEvent.CLICK,mcfunction);
mc.btn.addEventListener(MouseEvent.CLICK,btnfucntion);
function mcfunction(event:MouseEvent) {
trace("mc click");
}
function btnfucntion(event:MouseEvent) {
trace("btn click");
event.stopPropagation();//修改在此處。簡單一句,解決問題
}
現(xiàn)在可以試試,點擊btn運行得到的結(jié)果就是
代碼:
btn click
說明,已經(jīng)防止了冒泡階段中對mc偵聽函數(shù)的處理。也就沒有trace(“mc click”)了
As3事件機(jī)制遠(yuǎn)遠(yuǎn)不像這里寫的那么簡單,還有很多東西需要研究。
本文只為拋磚引玉,讓各位能先了解一下冒泡機(jī)制。
希望能多的朋友能提供相關(guān)的學(xué)習(xí)資料
posted on 2010-03-15 15:03
暗夜教父 閱讀(474)
評論(0) 編輯 收藏 引用 所屬分類:
AS3