說起這個(gè)對(duì)象,其實(shí)在很多C語言程序中并不是什么新概念,它主要是作為測(cè)試環(huán)境中的消息接受器或者是改進(jìn)程序的效率而存在的,但在Flash MX中恰到好處地出現(xiàn)了。
Listener對(duì)象需要包含調(diào)用目標(biāo)所需要的事件集合,事件集合內(nèi)可以定義對(duì)事件的處理程序,目標(biāo)函數(shù)如果需要Listener對(duì)象,必須支持加入Listener的方法。
在Flash MX中支持Listener的對(duì)象有六種:FStyleFormat、Key、Mouse、Selection、Stage和TextField,通過addListener支持Listener。
Key:
在Key對(duì)象中的Listener可以獲取onKeyDown和onKeyUp時(shí)間(當(dāng)然,也沒別的事件可以獲取……),一個(gè)獲取鍵盤按下和放開的事件監(jiān)聽:
lsn = new Object();
lsn.onKeyDown = function () {trace("down") };
lsn.onKeyUp = function () {trace("up") };
Key.addListener(lsn);
定義Listener的過程很簡(jiǎn)單,畢竟其本身既是一個(gè)對(duì)象,并且內(nèi)部只需要響應(yīng)事件的集合即可,*通過支持Listener的方法來得到事件入口并開始觸發(fā)響應(yīng)。
Mouse:
Mouse可以給Listener獲取的是onMouseDown、onMouseMove、onMouseUp事件,一個(gè)獲取鼠標(biāo)事件的例子:
createEmptyMovieClip("mc", 1);
lsn2 = new Object();
lsn2.onMouseUp = function () {trace("mouse up") };
lsn2.onMouseDown = function () {trace("mouse down") };
lsn2.onMouseMove = function () {trace("mouse moving...") };
mc.onMouseUp = function () {trace("movie mouse up") };
mc.onMouseDown = function () {trace("movie mouse down") };
mc.onMouseMove = function () {trace("movie mouse moving...") };
Mouse.addListener(lsn2);
這個(gè)例子也比較明了,但說明了一些事情。在有相同事件和Listener都存在的時(shí)候,也許你會(huì)問到優(yōu)先級(jí)的問題,而也直接涉及到了Listener的生存周期問題。
Listener的概念存在不是為了搶/覆蓋原目標(biāo)程序的事件,是為了測(cè)試和提高程序運(yùn)行效率而存在的,所以在Flash MX中的Listener也是同樣,優(yōu)先級(jí)會(huì)低于原目標(biāo)事件的相同事件,而只有當(dāng)目標(biāo)的生存期消失或者目標(biāo)使用了取消監(jiān)聽的方法才是Listener的生存期的重點(diǎn)。直觀的可以表達(dá)為一個(gè)人正在吃飯碰巧一只蚊子在他吃飯的時(shí)候才喝你的血液,這個(gè)人吃多少它喝多少(大肚蚊子君),但不會(huì)影響到這個(gè)人正常的生活(知道拍死它或者這個(gè)人不小心正常/異常死亡為止)。
Selection:
Selection可以獲取的只有onFocus事件。
createTextField("tf",2,100,200,100,20);
tf.text="my design sucks?";
lsn3 = new Object();
lsn3.onSetFocus = function () {trace("focus") };
Selection.addListener(lsn3);
Selection.setFocus(tf);
Selection的Listener只有在該對(duì)象獲取焦點(diǎn)或者使用setFocus方法的時(shí)候才會(huì)觸發(fā),而這些的必要條件是用戶使用鼠標(biāo)點(diǎn)擊了一個(gè)文本區(qū)(場(chǎng)景內(nèi)存在一個(gè)文本區(qū)對(duì)象)。
不過如果增加onSelect該有多好……(其實(shí)用onMouseUp和getendindex也可以實(shí)現(xiàn))。
Stage:Stage的更加簡(jiǎn)單,只是當(dāng)場(chǎng)景的大小發(fā)生變化(場(chǎng)景縮放)的時(shí)候獲取onResize事件,前提條件是stage.scalemode=”noscale”且不是ShowAll顯示。
lsn4 = new Object();
lsn4.onresize = function () {
trace("size changing...");
};
Stage.scaleMode="noscale";
Stage.addListener(lsn4);
TextField:
TextField可以獲取的是onChanged和onScroller事件,我們結(jié)合昨天的部分程序?qū)懸粋€(gè)例子:
Movieclip.prototype.makeBox = function(x, y, l) {
this.lineto(x, y+l);
this.lineto(x+l, y+l);
this.lineto(x+l, y);
this.lineto(x, y);
};
createEmptyMovieClip("scrollUp",3);
with (scrollUp) {
lineStyle(1,0x999999,50);
moveTo(550,200);
beginFill(0x345678,20);
makeBox(550,200,30);
endfill();
}
duplicateMovieClip(scrollUp, "scrolldown", 4);
scrollUp._y-=60;
scrollUp.onPress=function(){txt.scroll--};
scrollDown.onPress=function(){txt.scroll++};
createTextField("txt",5,300,10,100,40);
txt.border=1;
txt.wordwrap=1;
txt.multiline=1;
txt.type="input";
lsn5 = new Object();
lsn5.onScroller = function () {trace("text scrolling") };
lsn5.onChanged = function () {trace("text changed") };
txt.addListener(lsn5);
當(dāng)文本超過*長(zhǎng)度的時(shí)候或者用戶按下了scroll按鈕的時(shí)候并且沒有超過*/*scroll范圍的時(shí)候取得onScroller響應(yīng);而用戶輸入文本的時(shí)候響應(yīng)onChanged事件。
FStyleFormat:
FStyleFormat的Listener的作用針對(duì)于Components。當(dāng)用戶使用了Components UI或者自定義的Components的時(shí)候,如果使用了addListener,那么新的Components的樣式就會(huì)繼承為L(zhǎng)istener的樣式,例如常用的既是:
globalStyleFormat.background=0x333333;
globalStyleFormat.addListener(ckbox);
場(chǎng)景中存在了一個(gè)Components UI的check box的Instance,那么只要使用了addListener之后,那個(gè)instance的背景將跟隨globalStyleFormat的背景色(自定義的styleFormat也可以)。
今天雖然寫到現(xiàn)在已是很晚,但也幸福的有女朋友在旁邊陪伴……
源文件:
注:
Listener和Handler
Listener和Handler的區(qū)別,從本質(zhì)即可表達(dá)為一個(gè)是對(duì)象,一個(gè)是程序。