android的界面触摸事件分为三种,action_down,action_move,action_up这几个事件。这里我们主要说一下action_down事件的传递。
首先android的事件是从父控件->子空间,再从子控件->父控件。U型传递。
android的控件分为两种viewgroup和view;
viewgroup处理事件时有三个方法,dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
view处理事件有两个方法,dispatchTouchEvent、onTouchEvent

Activity只有dispatchTouchEvent、onTouchEvent两个事件

从我们点击屏幕开始,这个时候我们的最外层的布局控件接收到action_down事件,由于布局文件基本都是继承于viewgroup,首先是dipatchTouchEvent接收到事件,然后传递给onInterceptTouchEvent,它确定是不是拦截事件,如果拦截事件,这时action_down事件就会传递到布局控件的onTouchEvent事件中处理掉,结束传递。如果不拦截事件,就继续向子控件传递,进入到子控件的dispatchTouchEvent事件中,如果子控件也是布局控件就继续上个流程,如果不是就分发到子控件的onTouchEvent事件中,这时如果子控件的onTouchEvent事件中没有对事件进行处理,也就是返回false。就会传递回上一层的父控件的onTouchEvent事件中,如果父控件也不处理,就继续向上一层的onTouchEvent传递。

ACTION_DOWN事件传递路径

android view 把点击事件传给其他view android ui事件传递_布局控件


ACTION_MOVE ACTION_UP事件传递路径主要受ACTION_DOWN的影响:

ACTION_DOWN的起点就是ACTION_UP,ATION_MOVE的起点,ACTION_DOWN事件被消费的终点就是ACTION_UP,ACTION_MOVE的终点。起点和终点之间的最短传递路径就是ACTION_UP,ACTION_MOVE的路径。

如果Action_down事件,从Activity的dispatchevent事件一路传到了Activity的ontouchevent事件,那么Action_up,Action_move事件就取Action_down事件传递中最快把起点和终点连接起来的路径。例1,如果Action_down的传递路径如下:

android view 把点击事件传给其他view android ui事件传递_控件_02


那么Action_move,Action_up的传递路径:可以看到起点是Action_down的起点,终点是Action_down事件一直没有被消费最终传到了Activity的ontouchevent事件中。

android view 把点击事件传给其他view android ui事件传递_事件传递_03


例2,Action_down的起点不变,但是Action_down事件在ViewGroup的ontouchevent事件中被消费了。

android view 把点击事件传给其他view android ui事件传递_事件传递_04


那么,Action_move,Action_up事件起点是一样的,终点也是一样的,只不过传递的路径不需要经过ViewGroup的oninterceptEvent

事件。

android view 把点击事件传给其他view android ui事件传递_事件传递_05


综上所诉,Action_move,Action_up事件的传递路径的起点和终点和Action_down事件是一样的,只是Action_move,Action_up事件的传递路径把Action_down中间多余的传递步骤去掉了,取了最短路径。

哪些方法可以消费Action_down事件是重点
onTouch事件在onTouchEvent事件之前被调用,onClick事件在action_up处理结束之后被调用