触摸事件用MotionEvent表示,在Android中,一个触摸事件从产生到最终起作用,是一个很复杂的过程,但思路还是很清晰的,就是一层一层的传递,通过一个boolean值判断是否拦截或者消耗(也就是使用掉这个事件)。下面从基础的事件产生过程开始梳理整个流程: 事件的类型:一般使用手机,在屏幕上的操作就是点击或滑动,所以一般触摸事件分为两类:
可以看到,事件的开始都是ACTION_DOWN,结束是ACTION_UP。滑动事件相比点击事件,多了n个ACTION_MOVE事件,也就是滑动过程中手指与屏幕的交互,其他就没什么区别了。 事件的传递过程:在Android中,Activity作为界面显示的基础,通常用来接收触摸事件,然后分发给界面中的视图控件。当一个触摸事件产生时,最先传递给当前Activity,然后由Activity内部的Window将事件传递给DecorView(也就是当前屏幕显示的界面的底层容器)接下来就是在开发者编写的ViewGroup和View中传递了,所以整理下事件传递过程如下图: 从图中可以看到,由于DecorView继承自FrameLayout,所以它是一个ViewGroup,ContentView也是一个ViewGroup,因此,整个传递过程可以简化为三个步骤: Activity—->ViewGroup…—->View 也就是从Activity传递到ViewGroup,再经过n步的ViewGroup之间传递,最终传递给View。 事件传递的代码实现:将以上传递规则通过代码实现,主要涉及到以下三个方法:
在Activity中存在两个回调方法:
在ViewGroup中存在三个回调方法:
在View中存在两个回调方法:
可以看到,以上三个方法的返回值类型都是boolean类型,正如前面所说,在事件的传递过程中,通过boolean值判断是否拦截或者消耗,因此,有必要搞明白这三个方法的不同返回值的意义。 接下来通过测试代码加图解的方式来说明这三个方法的工作流程以及一些返回值的意义 点击View时的事件传递一个自定义的ViewGroup,里面有一个自定义View,都是通过重写上述三个方法,用logcat跟踪事件流向,整个界面布局中只有这一个ViewGroup和其中的view,在MaintActivity中给他们都设置了onTouchListener,代码很简单,所以就不贴出来了。 下面是当View的onTouch返回false时,运行的logcat: 然后是根据运行情况,画的一个简单的流程图: 接下来是当View的onTouch返回true时,运行的logcat: 然后是流程图: 通过以上对比可以得出结论:
以上,关于View的触摸事件传递,就先分析到这里 参考资料: |
|
来自: gearss > 《安卓编程-java》