触摸事件的类型
ACTION_DOWN 用户的手指按下的操作
ACTION_MOVE 用户的手指按下且有移动一段距离
ACTION{_UP用户离开屏幕,抬起手
事件传递的三个阶段
1 分发(dispatchTouchEvent):事件的分发对应的dispatchTouchEvent.如果事件是传递给当前的View,那么此方法一定会被调用,返回的结果受当前的View的onTouchEvent和下一级的View的dispatchTouchEvent方法的影响,表示是否消耗当前的事件。
2 onInterceptTouchEvent 在dispatchTouchEvent方法的内部调用,用来判断是否拦截某个事件,如果当前的View拦截了某一个事件,那么在同一个事件的序列中,此方法就不会被再次调用,返回的结果表示是否拦截当前的事件。
3 onTouchEvent 在dispatchTouchEvent方法中调用。用来处理点击事件,返回的结果表示是否消耗当前的事件。如果不消耗,就在同一个事件的徐磊中,当前的View就无法再次接受到事件。
上面的伪代码已经将三者的关系表现的清楚,了解点击事件的传递规则:对于一个根ViewGroup来说,点击事件发生后,首先传递给它的dispatchTouchEvent就会调用,如果这个Viewgroup的onInterceptTouchEvnet方法返回的true表示它要拦截当前的事件,接着事件就给个ViewGroup处理,那么它的onTouchEvnet方法是会被调用的;如果这个ViewGroup的onInterceptTouchEvent方法返回的false就表示它不拦截当前的事件,这时候当前的事件就会传递给他的子元素,接着子元素的dispatchTouchTouchEvent方法就会被调用,如此反复的直到事件被最终的处理。
TouchSlop
TouchSlop是系统能识别出华东的最小距离,也就是说在屏幕上滑动的距离小于这个常量呢么系统是不认为是在滑动的。通过这个方式是可以获取这个常量的:ViewConfiguration.get(getContext()).getScaledTouchSlop()。这个常量的意义在于我们处理滑动时候可以利用这个常量来做一些过滤。比如当有两次的滑动事件小于这个距离值。我们就可以认为未达到滑动的临界值。我们就不认为它是不滑动的。可以在源码中找到这个常量的意义。在frameworks/base/core/res/res/values/config.xml文件中。这个“config_viewConfigurationTouchSlop”对应的就是这个常量的定义
当一个View需要处理事件时候,如果它设置啦OnTouchListenser,那么OnTouchListenser中的onTouch的方法会被回调。这个事件如何处理还要看onTouch的返回值,如果返回false,则当前的View的onTouchEvent方法是被回调的;如果返回true,那么onTouchEvent方法将不会被调用。由此可见,给View设置的OnTouchListener,其优先级别是比onTouchEvent要高。在onTouchEvent方法中,如果设置有OnclickListener,那么它的onClick方法会被调用。可以看出我们常用的OnClickListen,它的优先级别是最低的。处于事件传递你的微端。
当一个点击事件产生后,它的传递的过场依照的如下ode顺序:Activity -->Window-->View.即事件的总先传递给Activity,再传递给Window,最后再传递给顶级的View.顶级的View接受到事件后,就会依照事件的分发机制去分发事件。