Android中View的事件分發機制——Android開發藝術探索筆記

來源:互聯網
上載者:User

標籤:筆記   public   type   view設定   span   ++   .net   處理過程   lang   

原文連結 http://sparkyuan.me/ 轉載請註明出處介紹

點擊事件的事件分發就是對MotionEvent事件的分發過程。當一個MotionEvent產生了以後,系統須要把這個事件傳遞給一個詳細的View,而這個傳遞的過程就是分發的過程。

涉及到的三個方法
  • dispatchTouchEvent:用來進行事件的分發,假設事件可以傳遞給當前View。那麼此方法一定會被調用,返回結果受當前View的onTouchEvent和View的dispatchTouchEvent方法的影響,表示是否當消耗當前事件
  • onInterceptTouchEvent:用來推斷是否攔截某個事件,假設當前View攔截了某個事件,那麼在同一個事件序列其中,此方法不會被再次調用,返回結果表示是否攔截當前事件;
  • onTouchEvent:在dispatchTouchEvent方法中調用。用來處理點擊事件,返回結果表示是否消耗當前事件,假設不消耗,則在同一個事件序列中。當前View無法再次接收到事件。
三個方法之間的關係
public boolean dispatchTouchEvent(MotionEvent ev) {     boolean consume = false;    if(onInterceptTouchEvent(ev)) {         consume = onTouchEvent(ev);    } else {         consume = child.dispatchTouchEvent(ev);     }    return consume; }

上面的虛擬碼非常好的描寫敘述了三者之間的關係。假設當前View攔截事件,就交給自己的onTouchEvent去處理,否則就傳給子View。直到事件被終於處理。

事件分發順序

當一個點擊事件產生後。它的傳遞步驟例如以下:Activity -> Window -> View。假設View的onTouchEvent返回false,那麼它的父容器onTouchEvent將會被調用。以此類推。終於將由Activity的onTouchEvent處理。

Activity對事件的分發過程

Activity -> Window -> DecorView。

Windows是一個抽象類別。可以控制頂級View的外觀和行為策略,PhoneWindow是這個類的唯一個實現。
DecorView就是當前介面的底層容器。即setContentView所設定的View是它的一個子View。

頂級View對點擊事件的分發過程

ViewGroup -> dispatchTouchEvent -> onInterceptTouchEvent -> onTouch or onTouchEvent

頂級View一般都是一個ViewGroup。

攔截事件之後,假設ViewGroup設定了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。假設onTouchEvent設定了mOnClickListener。則Listener裡的onClick會被調用。假設ViewGroup沒有攔截則傳給子View直到整個事件分發完畢。

View對點擊事件的處理過程

假設View設定了mOnTouchListener,則Listener裡的onTouch方法會屏蔽掉onTouchEvent。

假設onTouchEvent設定了mOnClickListener,則Listener裡的onClick會被調用。


View沒有onInterceptTouchEvent方法,一旦有點擊事件傳遞給他。他就會處理。

註:上面僅僅是描寫敘述了事件分發過程的原理,關於原始碼的分析請參考書本的對應章節。

歡迎轉載。轉載請註明出處http://blog.csdn.net/l664675249/article/details/50738102

Android中View的事件分發機制——Android開發藝術探索筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.