天才教育網(wǎng)合作機(jī)構(gòu) > 設(shè)計(jì)軟件培訓(xùn)機(jī)構(gòu) > Flash培訓(xùn)機(jī)構(gòu) >

東莞設(shè)計(jì)培訓(xùn)網(wǎng)

歡迎您!
朋友圈

400-850-8622

全國(guó)統(tǒng)一學(xué)習(xí)專線 9:00-21:00

位置:設(shè)計(jì)軟件培訓(xùn)資訊 > Flash培訓(xùn)資訊 > 體驗(yàn)Flash MX(7):及時(shí)監(jiān)聽對(duì)象Listener

體驗(yàn)Flash MX(7):及時(shí)監(jiān)聽對(duì)象Listener

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

  說起這個(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è)是程序。

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