android系统中的每个View的子类都具有下面三个和TouchEvent处理密切相关的方法:
1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev)这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev)这个方法用来处理TouchEvent
Activity 和 View 中没有 onInterceptTouchEvent (顶端和末端没必要拦截)
内部机制中 dispatchTouchEvent 会调用 onInterceptTouchEvent 来判断是否要进行拦截事件
事件类型
事件分发流程
Activity ->PhoneWindow ->DecorView -> ViewGroup -> View
事件回传,返回 true ,代表消费了事件,返回false表示事件没有被消费
继续传递事件。
情况1 只有ViewGroup : 先进行分发,再进行拦截,再触发点击事件:
ViewGroup dispatchTouchEvent ACTION_DOWN
ViewGroup onInterceptTouchEvent ACTION_DOWN
ViewGroup onTouchEvent ACTION_DOWN
情况1:如果有子View,并且ViewGroup不进行拦截:
//ViewGroup 分发和拦截dowm事件
ViewGroup dispatchTouchEvent ACTION_DOWN
ViewGroup onInterceptTouchEvent ACTION_DOWN
//View 分发和触发down事件
View dispatchTouchEvent ACTION_DOWN
View onTouchEvent ACTION_DOWN
//ViewGroup 分发和拦截up事件
ViewGroup dispatchTouchEvent ACTION_UP
ViewGroup onInterceptTouchEvent ACTION_UP
View 分发和触发up事件
View dispatchTouchEvent ACTION_UP
View onTouchEvent ACTION_UP
事件分发的几个主要方法与其返回值的意义
一、dispatchOnTouchEvent()的三个返回值:
1.true 表示这个事件被当前的View或ViewGroup消费,也不会传递给当前View
或者VievGroup
的onInterceptTouchEvent
方法进行处理,就 dispatchOnTouchEvent
消费了事件。
当为ViewGroup 时 消费了事件,只会执行
dispatchOnTouchEvent
的ACTION_DOWN
和ACTION_UP
当为View 时 消费了事件,只会执行dispatchOnTouchEvent
的ACTION_DOWN
方法
2.false 表示这个事件不会再往上(内)层的View传递了,而是直接交给下(外)层View的onTouchEvent()去处理。(比如ViewGroup 会传递给Activity
进行 onTouchEvent
处理,而不会传递给子View
)传给父级View
当为
ViewGroup
时 消费了事件 只会执行 只会执行dispatchOnTouchEvent
的ACTION_DOWN
方法
但是Activity
会执行 onTouchEventACTION_DOWN
和 Activity onTouchEventACTION_UP
3.super.dispatchOnTouchEvent()返回super.dispatchOnTouchEvent()会将此事件传递给上(内)层 View的 dispatchOnTouchEvent去处理,并会执行 onInterceptTouchEvent
方法。
总结:dispatchOnTouchEvent的三个返回值中,除了super.dispatchOnTouchEvent()
会继续传递下去,其它的返回值都不会继续传递。
二、onInterceptTouchEvent()的三个返回值:
(注:View没有onInterceptTouchEvent方法,ViewGroup才会有)
1.true 按下去的down事件被onInterceptTouchEvent处理完之后返回true,之后的move、up等方法就不会交由onInterceptTouchEvent处理,而是全部(包括down事件)全部交由该层的onTouchEvent去处理。这样,目标View就接收不到任何事件。
子View不能接收任何事件,当前View 只处理 ViewGroup onTouchEvent
ACTION_DOWN
事件,其他事件交由
它的父View 如 Activity 处理. 拦截之后相当于以后的事件都和当前View 及子View没有关系了。
2.false 按下去的down事件被onInterceptTouchEvent处理完之后返回false,之后的move、up等方法会继续交由onInterceptTouchEvent处理,然后全部(包括down事件)往下传递,直到交由目标View的onTouchEvent去处理。
3.super.onInterceptTouchEvent()与返回false一样。
三、onTouchEvent()的三个返回值:
1.false 如果最终需要处理事件的View的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的View的onTouchEvent()处理。
View 返回 false 当前View只执行 dispatchTouchEvent
ACTION_DOWN
和 onTouchEventACTION_DOWN
不会执行UP 和其他事件,传递到最顶层进行处理 (如上一次是 ViewGroup 也不会处理,会传到 Activity 进行处理)
2.true 如果最终需要处理事件的View的onTouchEvent()返回了true,那么后续事件将可以继续传递给该View的onTouchEvent()处理。
相当于该View消费了事件 ,不会再将事件向上传递
3.super.onTouchEvent() 与返回true一样。