Touch事件相关的方法
dispatchTouchEvent(MotionEventev)、
onInterceptTouchEvent(MotionEventev)、
onTouchEvent(MotionEventev);
方法与Activity、View对应关系
Touch事件 函数功能 View ViewGroup Activity
dispatchTouchEvent(MotionEvent ev) 事件分发 Yes Yes Yes
onInterceptTouchEvent(MotionEvent ev) 事件拦截 No Yes No
onTouchEvent(MotionEvent ev) 事件响应 Yes Yes Yes
一个简单而完整的Touch事件的Event,是由ACTION_DOWN开始。
ACTIOM_UP结束。
可能有多个或没有ACTION_MOVE事件。
屏幕发生Touch事件,并将事件传递到Activity后
- Activity 的 dispatchTouchEvent方法会从View的最底层依次往上层传递;
- 传递过程根据dispatchTouchEvent的返回值判断是否继续传递;
- 传递过程可以将事件拦截不再继续传递,而在当前窗口进行消费;
- 事件分发后由onTouchEvent进行处理(消费);
- 消费过程根据onTouchEvent的返回值判断是否被消费(处理完成、结束);
传递过程: 根据dispatchTouchEvent的返回值判断是否继续传递。
规则是:
默认returnsuper.dispatchTouchEvent(ev),事件传递给
当前 View 的 onInterceptTouchEvent方法。
returntrue,事件停止传递;
returnfalse,事件返回给其上层View的 onTouchEvent;
传递过程: 可以根据onInterceptTouchEvent的返回值将事件拦截不再继续传递,而在当前窗口进行消费
规则是:
returntrue,将事件拦截,分发给当前View的onTouchEvent 进行处理。
returnfalse,将事件放行,传递给下一层View,如果是最外层View则,
分发给当前View的onTouchEvent进行处理。
默认returnsuper.onInterceptTouchEvent(ev)的值是false;
消费过程: 根据onTouchEvent的返回值判断是否被消费(处理完成、结束)
规则是:
returntrue,处理完成。
returnfalse,没有处理完成,继续传递下去。
默认return super.onTouchEvent 根据是否为容器类有所不同;
事件传递流程
Activity RelativeLayout LinearLayout
dispatchTouchEvent dispatchTouchEvent
onInterceptTouchEvent dispatchTouchEvent
onInterceptTouchEvent
onTouchEvent onTouchEvent onTouchEvent
1. 当TouchEvent发生时,首先在Activity层处理,传递由Activity的 dispatchTouchEvent方法进行分发,如果dispatchTouchEvent返回true,则交给这个Activity的onTouchEvent处理,如果dispatchTouchEvent返回 false,则交给这个 ViewGroup处理。
2. ViewGroup首先由dispatchTouchEvent方法进行分发,和Activity不同的是如果dispatchTouchEvent返回 false,则传递给interceptTouchEvent方法来决定是否要拦截这个事件,
如果 interceptTouchEvent返回 true,也就是拦截掉了,则交给它的onTouchEvent来处理,
如果 interceptTouchEvent返回 false,那么就传递给子 view,由子 view 的dispatchTouchEvent再来开始这个事件的分发。
在view层,如果事件传递onTouchEvent上了,这个方法返回了 false,那么这个事件会从这个 view往上传递,都是onTouchEvent来接收,直到事件被处理。
事件处理的三个方法
· dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。返回true表示不继续分发,事件没有被消费。返回false则继续往下分发,如果是ViewGroup则分发给onInterceptTouchEvent进行判断是否拦截该事件。
· onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。
· onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS可以)。