事件分发的相关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);
}