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);
}

推荐阅读更多精彩内容