Android Touch事件处理机制
当TouchEvent发生时,首先Activity将TouchEvent传递给最顶层的View, TouchEvent最先到达最顶层 view 的 dispatchTouchEvent ,然后由 dispatchTouchEvent 方法进行分发,如果dispatchTouchEvent返回true ,则交给这个view的onTouchEvent处理,如果dispatchTouchEvent返回 false ,则交给这个 view 的 interceptTouchEvent 方法来决定是否要拦截这个事件,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,由子 view 的 dispatchTouchEvent 再来开始这个事件的分发。如果事件传递到某一层的子 view 的 onTouchEvent 上了,这个方法返回了 false ,那么这个事件会从这个 view 往上传递,都是 onTouchEvent 来接收。而如果传递到最上面的 onTouchEvent 也返回 false 的话,这个事件就会“消失”,而且接收不到下一次事件。
onTouch方法: 是View的onTouchListener接口中定义的方法,当View绑定了onTouchListener后,当有touch事件触发时,就会调用onTouch方法。
onTouchEvent方法: 是重写了Activity中的方法。
Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层
Touch事件处理的几条基本原则:
1.如果在某个层级没有处理ACTION_DOWN,那么该层就再也收不到后续的Touch事件了,直到下ACTION_DOWN事件
说明:
a.某个层级没有处理某个事件指的是它以及它的子View都没有处理该事件
b.这条规则不适用于Activity层(它是顶层),他们可以收到每一个Touch事件。
c.没有处理ACTION_MOVE这类事件,不会有任何影响
2.如果ACTION_DOWN事件发生在某个View的范围之内,则后续的ACTION_MOVE,ACTION_UP和ACTION_CANCEL等事件都将发往该View,即使事件已经出界了
3.第一根按下的手指触发ACTION_DOWN事件,之后按下的手指触发ACTION_POINTER_DOWN事件,中间起来的手指触发ACTION_POINTER_UP事件,最后起来的手指触发ACTION_UP事件(即使它不是触发ACTION_DOWN事件的那根手指)。
4.pointer id可以跟踪手指,从按下的那个时刻起pointer id生效,直至起来的那一刻失效,这之间维持不变。
5.如果一个ACTION_DOWN事件被付View拦截了,则任何子View不会再收到任何Touch事件了(这符合第一点要求)
6.如果一个非ACTION_DOWN事件被父Vew拦截了,则那些上次处理了ACTION_DOWN事件的子View会收到一个ACTION_CANCEL事件,之后不会再收到任何Touch事件了,即使父View不再拦截后续的Touch事件。
7.如果父View决定处理Touch事件或者子View没有处理Touch事件,则父View按照普通View的处理方式处理Touch事件,否则它根本不处理Touch事件(它只负责分发)
8.如果父View在onInterceptTouchEvent中拦截事件,则onInterceptTouchEvent中不会再收到Touch事件了,事件被直接交给它自己处理
补充:移动开发 , Android ,