事件分發的相關api
// Activity中的觸摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
//ViewGroup中的觸摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
public boolean onInterceptTouchEvent(MotionEvent ev);
//View中的觸摸事件API
public boolean dispatchTouchEvent(MotionEvent ev);
public boolean onTouchEvent(MotionEvent ev);
-
dispatchTouchEvent:它是傳遞觸摸事件的接口。
- Activity將觸摸事件傳遞給ViewGroup,ViewGroup將觸摸事件傳遞給子ViewGroup或子View;這些都是通過dispatchTouchEvent()來傳遞的。
- dispatchTouchEvent(), onInterceptTouchEvent(), onTouchEvent()以及onTouch()它們之間的聯系,都是通過dispatchTouchEvent()體現的,它們都是在dispatchTouchEvent()中調度的.
- 返回值:true,表示觸摸事件被消費了;false,則表示觸摸事件沒有被消費。
-
onTouchEvent:它是處理觸摸事件的接口。
- 無論是Activity, ViewGroup還是View,對觸摸事件的處理,基本上都是在onTouchEvent()中進行的。因此,我們說它是處理觸摸事件的接口。
-
onInterceptTouchEvent:它是攔截觸摸事件的接口。
- 只有ViewGroup中才有該接口。如果ViewGroup不想將觸摸事件傳遞給它的子View,則可以通過調用onInterceptTouchEvent對事件進行攔截。
- 返回值:true,表示ViewGroup攔截了該觸摸事件;那么,該事件就不會分發給它的子View或者子ViewGroup。否則,表示ViewGroup沒有攔截該事件,該事件就會分發給它的子View和子ViewGroup。
如何判斷一個點擊事件是否在一個View的內部
- 一般情況下,我們會直接判斷是否在View范圍的內部,但是有的時候我們需要考慮觸摸范圍
//下面代碼來源于View的hide函數,用于onTouchEvent中
public boolean pointInView(float localX, float localY, float slop) {
return localX >= -slop && localY >= -slop && localX < ((mRight - mLeft) + slop) &&
localY < ((mBottom - mTop) + slop);
}