天才教育網(wǎng)合作機構 > 培訓機構 >

                                                                                        東莞設計培訓網(wǎng)

                                                                                        歡迎您!
                                                                                        朋友圈

                                                                                        全國統一學(xué)習專(zhuān)線(xiàn) 9:00-21:00

                                                                                        位置:培訓資訊 > 體驗Flash MX(7):及時(shí)監聽(tīng)對象Listener

                                                                                        體驗Flash MX(7):及時(shí)監聽(tīng)對象Listener

                                                                                        日期:2005-12-24 00:00:00     瀏覽:372    來(lái)源:東莞設計培訓網(wǎng)
                                                                                          從Flash 5的時(shí)候,我就一直在抱怨為什么enterframe的速度這么固定還這么慢?為什么對于Key對象我還必須去手動(dòng)建立一個(gè)MovieClip來(lái)接收事件并觸發(fā)它?為什么我不能及時(shí)準確地接受到我需要的信息呢??jì)|萬(wàn)個(gè)“為什么”總是關(guān)于速度和效率的話(huà)題,終于Flash MX帶來(lái)的一個(gè)新概念讓我得到滿(mǎn)足,那就是Listener——及時(shí)監聽(tīng)對象。

                                                                                          說(shuō)起這個(gè)對象,其實(shí)在很多C語(yǔ)言程序中并不是什么新概念,它主要是作為測試環(huán)境中的消息接受器或者是改進(jìn)程序的效率而存在的,但在Flash MX中恰到好處地出現了。
                                                                                          Listener對象需要包含調用目標所需要的事件集合,事件集合內可以定義對事件的處理程序,目標函數如果需要Listener對象,必須支持加入Listener的方法。
                                                                                          在Flash MX中支持Listener的對象有六種:FStyleFormat、Key、Mouse、Selection、Stage和TextField,通過(guò)addListener支持Listener。

                                                                                          Key:

                                                                                          在Key對象中的Listener可以獲取onKeyDown和onKeyUp時(shí)間(當然,也沒(méi)別的事件可以獲取……),一個(gè)獲取鍵盤(pán)按下和放開(kāi)的事件監聽(tīng):

                                                                                          lsn = new Object();

                                                                                          lsn.onKeyDown = function () {trace("down") };

                                                                                          lsn.onKeyUp = function () {trace("up") };

                                                                                          Key.addListener(lsn);

                                                                                          定義Listener的過(guò)程很簡(jiǎn)單,畢竟其本身既是一個(gè)對象,并且內部只需要響應事件的集合即可,*通過(guò)支持Listener的方法來(lái)得到事件入口并開(kāi)始觸發(fā)響應。

                                                                                          Mouse:

                                                                                          Mouse可以給Listener獲取的是onMouseDown、onMouseMove、onMouseUp事件,一個(gè)獲取鼠標事件的例子:

                                                                                          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è)例子也比較明了,但說(shuō)明了一些事情。在有相同事件和Listener都存在的時(shí)候,也許你會(huì )問(wèn)到優(yōu)先級的問(wèn)題,而也直接涉及到了Listener的生存周期問(wèn)題。

                                                                                          Listener的概念存在不是為了搶/覆蓋原目標程序的事件,是為了測試和提高程序運行效率而存在的,所以在Flash MX中的Listener也是同樣,優(yōu)先級會(huì )低于原目標事件的相同事件,而只有當目標的生存期消失或者目標使用了取消監聽(tīng)的方法才是Listener的生存期的重點(diǎn)。直觀(guān)的可以表達為一個(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只有在該對象獲取焦點(diǎn)或者使用setFocus方法的時(shí)候才會(huì )觸發(fā),而這些的必要條件是用戶(hù)使用鼠標點(diǎn)擊了一個(gè)文本區(場(chǎng)景內存在一個(gè)文本區對象)。

                                                                                          不過(guò)如果增加onSelect該有多好……(其實(shí)用onMouseUp和getendindex也可以實(shí)現)。

                                                                                          Stage:

                                                                                          Stage的更加簡(jiǎn)單,只是當場(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事件,我們結合昨天的部分程序寫(xiě)一個(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);

                                                                                          當文本超過(guò)*長(cháng)度的時(shí)候或者用戶(hù)按下了scroll按鈕的時(shí)候并且沒(méi)有超過(guò)*/*scroll范圍的時(shí)候取得onScroller響應;而用戶(hù)輸入文本的時(shí)候響應onChanged事件。

                                                                                          FStyleFormat:

                                                                                          FStyleFormat的Listener的作用針對于Components。當用戶(hù)使用了Components UI或者自定義的Components的時(shí)候,如果使用了addListener,那么新的Components的樣式就會(huì )繼承為L(cháng)istener的樣式,例如常用的既是:

                                                                                          globalStyleFormat.background=0x333333;

                                                                                          globalStyleFormat.addListener(ckbox);

                                                                                          場(chǎng)景中存在了一個(gè)Components UI的check box的Instance,那么只要使用了addListener之后,那個(gè)instance的背景將跟隨globalStyleFormat的背景色(自定義的styleFormat也可以)。

                                                                                          今天雖然寫(xiě)到現在已是很晚,但也幸福的有女朋友在旁邊陪伴……

                                                                                          源文件:

                                                                                          注:

                                                                                          Listener和Handler

                                                                                          Listener和Handler的區別,從本質(zhì)即可表達為一個(gè)是對象,一個(gè)是程序。

                                                                                        如果本頁(yè)不是您要找的課程,您也可以百度查找一下:

                                                                                        奇米在线7777在线精品|国产成人精品免费视|精品无码不卡一区二区三区|国内综合精品午夜久久资源|亚洲视频在线观看..