說起這個對象,其實在很多C語言程序中并不是什么新概念,它主要是作為測試環(huán)境中的消息接受器或者是改進程序的效率而存在的,但在Flash MX中恰到好處地出現了。
Listener對象需要包含調用目標所需要的事件集合,事件集合內可以定義對事件的處理程序,目標函數如果需要Listener對象,必須支持加入Listener的方法。
在Flash MX中支持Listener的對象有六種:FStyleFormat、Key、Mouse、Selection、Stage和TextField,通過addListener支持Listener。
Key:
在Key對象中的Listener可以獲取onKeyDown和onKeyUp時間(當然,也沒別的事件可以獲取……),一個獲取鍵盤按下和放開的事件監(jiān)聽:
lsn = new Object();
lsn.onKeyDown = function () {trace("down") };
lsn.onKeyUp = function () {trace("up") };
Key.addListener(lsn);
定義Listener的過程很簡單,畢竟其本身既是一個對象,并且內部只需要響應事件的集合即可,*通過支持Listener的方法來得到事件入口并開始觸發(fā)響應。
Mouse:
Mouse可以給Listener獲取的是onMouseDown、onMouseMove、onMouseUp事件,一個獲取鼠標事件的例子:
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);
這個例子也比較明了,但說明了一些事情。在有相同事件和Listener都存在的時候,也許你會問到優(yōu)先級的問題,而也直接涉及到了Listener的生存周期問題。
Listener的概念存在不是為了搶/覆蓋原目標程序的事件,是為了測試和提高程序運行效率而存在的,所以在Flash MX中的Listener也是同樣,優(yōu)先級會低于原目標事件的相同事件,而只有當目標的生存期消失或者目標使用了取消監(jiān)聽的方法才是Listener的生存期的重點。直觀的可以表達為一個人正在吃飯碰巧一只蚊子在他吃飯的時候才喝你的血液,這個人吃多少它喝多少(大肚蚊子君),但不會影響到這個人正常的生活(知道拍死它或者這個人不小心正常/異常死亡為止)。
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只有在該對象獲取焦點或者使用setFocus方法的時候才會觸發(fā),而這些的必要條件是用戶使用鼠標點擊了一個文本區(qū)(場景內存在一個文本區(qū)對象)。
不過如果增加onSelect該有多好……(其實用onMouseUp和getendindex也可以實現)。
Stage:Stage的更加簡單,只是當場景的大小發(fā)生變化(場景縮放)的時候獲取onResize事件,前提條件是stage.scalemode=”noscale”且不是ShowAll顯示。
lsn4 = new Object();
lsn4.onresize = function () {
trace("size changing...");
};
Stage.scaleMode="noscale";
Stage.addListener(lsn4);
TextField:
TextField可以獲取的是onChanged和onScroller事件,我們結合昨天的部分程序寫一個例子:
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);
當文本超過*長度的時候或者用戶按下了scroll按鈕的時候并且沒有超過*/*scroll范圍的時候取得onScroller響應;而用戶輸入文本的時候響應onChanged事件。
FStyleFormat:
FStyleFormat的Listener的作用針對于Components。當用戶使用了Components UI或者自定義的Components的時候,如果使用了addListener,那么新的Components的樣式就會繼承為Listener的樣式,例如常用的既是:
globalStyleFormat.background=0x333333;
globalStyleFormat.addListener(ckbox);
場景中存在了一個Components UI的check box的Instance,那么只要使用了addListener之后,那個instance的背景將跟隨globalStyleFormat的背景色(自定義的styleFormat也可以)。
今天雖然寫到現在已是很晚,但也幸福的有女朋友在旁邊陪伴……
源文件:
注:
Listener和Handler
Listener和Handler的區(qū)別,從本質即可表達為一個是對象,一個是程序。