Android事件处理机制
来源:互联网 发布:win10和mac os 编辑:程序博客网 时间:2024/05/16 15:47
学习Android以来一直搞不懂Android的事件分发机制,做项目的时候也就糊里糊涂的过去了。今天我打算跟大家详细探讨一下它的事件机制。(ps第一次写博客,如果写的不好请见谅哈)
android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件。所以我们就以Touch事件为例来探讨一下。
我写了一个测试项目,它的结构图如下
Android中一个简单的触摸事件可以分成若干个子事件(ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE>ACTION_UP)
进行事件处理的时候分成三部分:
(1)public boolean dispatchTouchEvent(MotionEvent ev) 这个方法用来分发TouchEvent
(2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
(3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent
事件分发 dispatvhTouchEvent
当用户触摸屏幕的时候,会首先触发父容器的dispatchTouchEvent方法。该方法返回一个布尔类型的值如果为true则交给这个容器的onTouchEvent方法进行处理,如果为false则分发给子view进行处理(如下图)。(只有viewgroup才有dispatchTouchEvent跟oninterceptTouchEvent方法,view只有onTouchEvent方法)
事件拦截onInterceptTouchEvent
这个方法的返回值决定着事件传递的方向,true表示不传递给子view,交给自身的OnTouchEvent方法进行处理。False表示传递给子view。这个方法的正确用法是只判断要不要拦截当前的event剩下的逻辑处理部分交给OnTouchEvent方法进行(ps这个方法是自上往下传递event的)。
事件处理OnTouchEvent
这个方法用于处理触摸事件,它也有一个返回值用于表示当前的view是不是已经消费了该事件,如果返回true则表示已经消费了该事件,事件不再传递。如果返回为false则表示当前没有消费该事件,返回给父view进行处理。如果所有的ViewGroup都没有重写OnTouchEvent方法跟OnInterceptTouchEvent方法,则事件的处理是这样的
当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2的onInterceptTouchEvent()返回值为true,则传递流程变成:
如果我们同时将LayoutView2的onInterceptTouchEvent()和onTouchEvent()设置成true,那么 LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWN的ACTION_MOVE或者ACTION_UP)会直接传给 LayoutView2的onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):
小总结:
onInterceptTouchEvent是自rootiew向下传递, onTouchEvent正好相反。
Oninterceptouchevent与 ontouchevent中的返回值true跟false都指的都是是否自己处理
测试项目源码下载
http://download.csdn.net/detail/u012792689/8146185
Android开发群:213052613
- Android事件处理机制
- android 事件处理机制
- Android事件处理机制
- Android事件处理机制
- android事件处理机制
- android事件处理机制
- Android事件处理机制
- android事件处理机制
- android事件处理机制
- Android 事件处理机制
- Android事件处理机制
- android事件处理机制
- android 事件处理机制
- android事件处理机制
- android事件处理机制
- Android 输入事件处理机制
- Android中的事件处理机制
- Android Touch事件处理机制
- vs 使用技巧
- 求两个正整数数的最大公约数和最小公倍数
- 大图片根据分辨率自适应宽度
- NGUI使用经验-Uitweener暂停继续的方法
- Android系统中标准Intent的使用
- Android事件处理机制
- 异常处理:Eclipse下解决Plugin execution not covered by lifecycle configuration异常
- Android的NDK开发(2)————利用Android NDK编写一个简单的HelloWorld
- How to create new view by using cleartool command in Clearcase?
- 前端实用的东西--持续更新
- 淘宝的十年技术之路
- C++标准模板库中的auto_ptr
- JS 数组扩展函数--求起始项到终止项和
- 30秒搭建Github Page