Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android事件分發機制淺談(一),android淺談

Android事件分發機制淺談(一),android淺談

編輯:關於android開發

Android事件分發機制淺談(一),android淺談


---恢復內容開始---

一、是什麼

      我們首先要了解什麼是事件分發,通俗的講就是,當一個觸摸事件發生的時候,從一個窗口到一個視圖,再到一個視圖,直至被消費的過程。

二、做什麼

         在深入學習android的過程中,我們往往不知道為什麼要去學習這些理論,它們枯燥,難懂,甚至在我們處於初級階段進行開發時完全用不到這些理論。

     所以我們要學會一些技術,要知道它能做些什麼。

         比較簡單的,在做開發時,如何處理滑動沖突的問題。

三、事件分發機制的分析。

          首先在這裡,這一節不過多的分析事件分發的源碼了,在下一節分析,有興趣的可以去看一看郭霖的博客,對源碼分析講的非常清楚,在這裡我主要講解一些我自己對它的理解。

          我們先在這裡認識三個方法

          dispatchTouchEvent(MotionEvent ev) //用來進行事件的分發

          onInterceptTouchEvent(MotionEvent ev) //在dispatchTouchEvent()中調用,用來判斷是否攔截某個事件

          onTouchEvent(MotionEvent ev)    //在dispatchTouchEvent()中調用,用來處理點擊事件

          //偽代碼分析,便於理解

          public boolean dispatchTouchEvent(MotionEvent ev){

                 boolean consume = false;

                 if(onInterceptTouchEvent(ev)){

                      consume = onTouchEvent(ev); 

                 } else{

                     consum = child.dispatchTouchEvent(ev);

                 }

      return consum;

          }

 

         首先我們將事件分發機制按兩個主角分開講,一個是ViewGroup,一個是View。

         對於ViewGroup而言

         當一個點擊事件產生後,dispatchTouchEvent()方法調用。如果onInterceptTouchEvent()方法返回true表示事件被攔截,返回false則該事件會交給子View繼續執行上述步驟,直至事件被處理。

         對於View而言

    處理事件,設置onTouchEventListener(),onTouch()回調,返回false,onTouchEvent()會被調用,若此時設置了setOnClickListener(),則onClick()方法會被調用。返回true,onTouchEvent()不會被調用,此時設置了setOnClickListener(),則onClick()方法並不會被調用。這便是View的分發機制

 

 

         簡單來說上面兩部分構成了事件分發機制,由於並沒有分析源碼,所以看起來很簡單,畫出流程圖來說是這樣的

        

         

       學習了這一節後,想必對android事件分發有了大致的了解,但可能還會有疑問,比如onClick方法為什麼有時候設置了也不會被調用,等等問題,我會在接下來分析源碼。

 

      補充:1、點擊事件產生後,遵循如下順序 Activity->Window->View

               2、當所有View都不處理事件時(onTouchEvent()返回false),事件會交還給Activity處理

      3、onTouch和onTouchEvent,都是在dispatchTouchEvent()中調用,onTouch優先於onTouchEvent執行。如果在onTouch方法中通過返回true將事件消費掉,onTouchEvent將不會再執行。另外需要注意的是,onTouch能夠得到執行需要兩個前提條件,第一mOnTouchListener的值不能為空,第二當前點擊的控件必須是enable的。因此如果你有一個控件是非enable的,那麼給它注冊onTouch事件將永遠得不到執行。對於這一類控件,如果我們想要監聽它的touch事件,就必須通過在該控件中重寫onTouchEvent方法來實現。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved