Android View事件分發

在騰訊的面試中被問到父View、子View的點擊事件流程,這幾天好好學習了一遍。主要參考張鴻洋郭霖的博客。

在觸發OnTouch事件的時候Android的GroupView會調用如下三個函數:
public boolean dispatchTouchEvent(MotionEvent ev) //用於事件的分發
public boolean onInterceptTouchEvent(MotionEvent ev) // 用於事件的攔截
public boolean onTouchEvent(MotionEvent ev) //處理事件

具體流程如下:

Created with Raphaël 2.1.0點擊ViewViewGroup的dispatchTouchEvent方法ViewGroip的onInterceptTouchEvent方法是否攔截,默認不攔截ViewGroup來處理Touch事件Touch事件被消費結束View的dispatchTouchEvent方法OnTouchListener的onTouch方法返回true ?View的onTouchEvent方法yesnoyesno
  1. touch事件都是先傳遞到ViewGroup,再傳遞到View的;
  2. ViewGroup的onInterceptTouchEvent方法用來攔截事件傳遞,默認返回false,不攔截;
  3. View的dispatchTouchEvent方法中會先調用OnTouchListener的onTouch方法,如果返回爲true,表示touch事件被消費;如果返回false,則會繼續執行View的onTouchEvent方法;
  4. 只要子View支持點擊或者長按事件,它的dispatchTouchEvent一定返回true,touch事件會被消費,ViewGroup的OnTouchListener將會監聽不到touch事件,onTouchEvent也就不會觸發。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章