Android觸摸事件-00基礎

事件分發的相關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);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容