云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Flex中的事件機制

          Posted on 2006-03-02 17:30 云自無心水自閑 閱讀(7703) 評論(11)  編輯  收藏 所屬分類: FlexFlex2

          一. 事件簡介
          事件可以由外設觸發, 比如:鍵盤,鼠標, 也可能是外部輸入, 比如:web service的返回.
          事件還能由組件的外觀和生命周期發生變化時觸發, 比如:組件的創建或者改變大小.
          所有用戶與應用交互都會產生事件.用戶沒有直接與應用交互也可能產生事件, 比如:數據裝載完畢.
          你可以在程序中使用事件監聽器監聽這些事件. 事件監聽器是函數方法用于響應指定的事件. 有時也稱之為事件處理器.
          Flex的事件模型基于DOM3事件模型.
          組件產生派發事件并消費(監聽)其他事件.如果一個對象想要了解其他對象事件的信息, 可以注冊一個監聽器.
          當事件發生時,對象派發此事件到所有注冊過的監聽器中.
          組件有Flex提供的內建事件. 也可以使用派發-監聽模型定義自己的事件監聽器, 并指定監聽器監聽何種事件.
          二. 事件流簡介
          當一個事件被派發出來時, 事件對象從根節點開始自上而下開始掃描display list, 一直到目標對象, 檢查每個節點是否有相應的監聽器.
          目標對象指的是display list中產生事件的對象. 比如:
          <mx:Panel>
              <mx:HBox>
                  <mx:VBox>
                          <mx:Button />
                  </mx:VBox>
              </mx:HBox>
          </mx:Panel>
          如何此時 resize了VBox, 則會從根(Application)開始, 下來檢查Panel, HBox, 直到目標對象-產生resize事件的VBox為止.

          三. 事件的派發
          Flex中可以通過dispatchEvent()方法手工派發事件, 所有UIComponent的子類都可以調用此方法.
          語法:
          objectInstance.dispatchEvent(new Event("event_type"):Boolean
          參數event_type是Event對象的type屬性. 函數的返回值總是True.
          可以使用此方法派發任意事件, 而不僅僅是用戶自定義事件, 比如: 可以派發一個Button的Click事件.
          var result:Boolean = buttonInstance.dispatchEvent(new Event(MouseEvent.CLICK));

          在Flex應用中不是必須對新派發的事件進行處理, 如果觸發了一個事件, 而沒有對應的Listener時,Flex忽略此事件.
          如果想給Event對象添加新屬性, 就必須繼承Event類,然后定義新屬性

          四.事件的傳播:
          事件觸發后, Flex有3個檢測事件監聽器的階段, 3個階段的發生的順序如下:
          1. 捕獲
          2. 目標
          3. 上浮
          在任意一個階段, 節點們都有機會操作事件. 比如: 用戶點擊了一個在VBox中的Button,
          在捕獲階段, Flex檢查Application對象(根節點)和VBox是否有監聽器處理此事件. Flex然后在目標階段觸發按鈕的監聽器.
          在上浮階段, VBox和應用以與捕獲階段相反的順序再次獲得機會處理事件.
          在ActionScript3.0中,你可以在任意目標節點上注冊事件監聽器. 但是部分事件會被直接傳給目標節點,比如Socket類.
          捕獲階段的節點順序是從父節點到子節點的, 而上浮階段剛好相反.
          捕獲事件缺省是關閉的,也就是說如果要捕獲事件, 必須顯式指定在捕獲階段進行處理.
          每一個Event都有target和currentTarget屬性, 幫助跟蹤事件傳播的過程.

          捕獲階段:
          在捕獲階段,Flex在顯示列表中檢查事件的祖先是否注冊了事件的監聽器. Flex從根節點開始順序而下.
          大多數情況中, 根節點是Application對象. 同時, Flex改變事件的currentTarget值.
          缺省情況下, 在此階段,沒有容器監聽事件. use_capture參數的值是False,在此階段添加監聽的唯一方法是在調用add_listener時,
          傳入一個為True值的use_capture參數, 比如:
          myAccordion.addEventListener(MouseEvent.MOUSE_DOWN, customLogEvent, true);
          如果是在Mxml中添加監聽, Flex設置此參數為False, 沒有辦法進行修改.
              如果設置了use_capture為True, 那么事件將不會上浮. 如果既想捕獲又想上浮就必須調用 addEventListener兩次.
          一次use_capture參數為true, 一次為false;
              捕獲很少使用, 上浮的使用更為普遍.

             目標階段:
          在目標階段, Flex激發事件的監聽程序, 不檢查其他的節點.

          上浮階段:
          事件只在bubbles屬性為True時才進行上浮. 可以上浮的事件包括: change, click, doubleClick, keyDown, keyUp, mouseDown, mouseUp.
          在上浮階段, Flex改變事件的currentTarget屬性, 而target屬性是初始派發事件的對象.

          查詢事件階段:
          使用事件的eventPhase可以獲得事件當前的階段,
          1: CAPTURE_PHASE
          2: AT_TARGET
          3: BUBBLING_PHASE
          示例: private function determineState(event:MouseEvent):Void { Debug.trace(event.eventPhase + ":" + event.currentTarget.id); }

          停止傳播:
          使用下面兩個函數停止事件的傳播:
          stopPropagation()
          stopImmediatePropagation()




          評論

          # re: Flex中的事件機制  回復  更多評論   

          2008-05-19 13:12 by 找中印
          如果有實例就更好哦

          # re: Flex中的事件機制  回復  更多評論   

          2009-02-22 22:02 by Fising
          轉載到我的博客了,博主不反對吧?

          # re: Flex中的事件機制  回復  更多評論   

          2009-05-07 12:01 by 侃侃
          學到了不少!
          轉到俺空間咯~

          # re: Flex中的事件機制  回復  更多評論   

          2009-11-24 16:36 by rplees
          LZ,不建議我轉走吧。

          # re: Flex中的事件機制  回復  更多評論   

          2010-02-02 14:33 by 驍勇善戰
          我也轉了,博主你可以刪除了

          # re: Flex中的事件機制  回復  更多評論   

          2010-02-03 20:08 by usherlight
          轉的人多好啊,說明感興趣的人多。

          # re: Flex中的事件機制  回復  更多評論   

          2010-02-05 14:44 by bnmbj
          不可以轉的,我好不容易寫出來的。怎么都轉載到這里啦?

          # re: Flex中的事件機制  回復  更多評論   

          2010-02-09 20:52 by usherlight
          @bnmbj
          這篇文章肯定不是轉載而來。

          # re: Flex中的事件機制  回復  更多評論   

          2010-08-27 14:15 by 無語
          一堆廢話,看完沒點用處,還不如來一個實例實在。

          # re: Flex中的事件機制  回復  更多評論   

          2010-08-27 19:43 by usherlight
          @無語
          大多數時候,理論知識都是比較枯燥的,但這都是根本。
          我覺得我們應該學習的是知識,而不是某些技能,比如,如何使用Spring,Hibernate。要知其所以然。

          # re: Flex中的事件機制  回復  更多評論   

          2010-09-02 15:37 by JohnKing
          謝謝樓主了,轉載了哈。
          主站蜘蛛池模板: 卢氏县| 裕民县| 方山县| 凤山市| 西丰县| 嘉禾县| 日土县| 云龙县| 万盛区| 玉溪市| 扶绥县| 无为县| 饶阳县| 普兰县| 苍南县| 正镶白旗| 南昌县| 特克斯县| 重庆市| 沁水县| 北碚区| 白银市| 通化市| 江山市| 公安县| 合作市| 达拉特旗| 秭归县| 梧州市| 旺苍县| 湟源县| 共和县| 镇雄县| 晋宁县| 当阳市| 兰西县| 阿克苏市| 托克逊县| 六盘水市| 长兴县| 涿鹿县|