Android中跟Touch事件有关的事件有三个:
1、public boolean dispatchTouchEvent(MotionEvent ev):传递Touch事件至target view。
2、public boolean onInterceptTouchEvent(MotionEvent ev):在ViewGroup中定义,用于拦截Touch事件的传递。
3、public boolean onTouchEvent(MotionEvent event): Touch事件处理函数。
先说下事件传递的两种方式:
1、隧道方式:从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递。
2、冒泡方式:从最内层子元素依次往外传递直到根元素或在中间某一元素中由于某一条件停止传递。
Touch事件通过dispatchTouchEvent以隧道方式从上往下传递。
Touch事件传递过程中经过的元素都是一个View,但是事件处理的最外层的元素却不是View,除下跟Window有关的事件,当一个Touch事件发生的时候,会首先调用当前Activity的dispatchTouchEvent函数,然后才将事件传递至下层的View元素。
如果调用一个View的onTouchEvent函数时返回true的话,那么接下来的Touch Event事件仍会传递到这个View并调用它的onTouchEvent函数,在onTouchEvent函数中可以根据条件返回不同的值,如果某一次在此函数中返回了false那么接下来的Touch Event事件就不会再传递到这个View,而会在其Parent View终止,调用其Parent View的onTouchEvent。如果所有的View都的onTouchEvent函数都返回false,那么接下来的Touch Event事件会由Activity处理,即调用Activity的onTouchEvent函数。
当调用ViewGroup的dispatchTouchEvent函数时,会首先调用onInterceptTouchEvent函数判断有没有拦截事件,如果没有拦截则会依次调用这个ViewGroup的所有子View的dispatchTouchEvent函数。