Android事件处理机制

来源:互联网 发布:win10和mac os 编辑:程序博客网 时间:2024/05/16 15:47

       学习Android以来一直搞不懂Android的事件分发机制,做项目的时候也就糊里糊涂的过去了。今天我打算跟大家详细探讨一下它的事件机制。(ps第一次写博客,如果写的不好请见谅哈)

      android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件。所以我们就以Touch事件为例来探讨一下。

       我写了一个测试项目,它的结构图如下

       thisisa

      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才有dispatchTouchEventoninterceptTouchEvent方法,view只有onTouchEvent方法)

          

 事件拦截onInterceptTouchEvent

这个方法的返回值决定着事件传递的方向,true表示不传递给子view,交给自身的OnTouchEvent方法进行处理。False表示传递给子view。这个方法的正确用法是只判断要不要拦截当前的event剩下的逻辑处理部分交给OnTouchEvent方法进行(ps这个方法是自上往下传递event的)。

事件处理OnTouchEvent

这个方法用于处理触摸事件,它也有一个返回值用于表示当前的view是不是已经消费了该事件,如果返回true则表示已经消费了该事件,事件不再传递。如果返回为false则表示当前没有消费该事件,返回给父view进行处理。如果所有的ViewGroup都没有重写OnTouchEvent方法跟OnInterceptTouchEvent方法,则事件的处理是这样的

当某个控件的onInterceptTouchEvent()返回值为true时,就会发生截断,事件被传到当前控件的onTouchEvent()。如我们将LayoutView2onInterceptTouchEvent()返回值为true,则传递流程变成:

如果我们同时将LayoutView2onInterceptTouchEvent()onTouchEvent()设置成true,那么 LayoutView2将消费被传递的事件,同时后续事件(如跟着ACTION_DOWNACTION_MOVE或者ACTION_UP)会直接传给 LayoutView2onTouchEvent(),不传给其他任何控件的任何函数。同时传递给子空间一个ACTION_CANCEL事件。传递流程变成(图中没有画出ACTION_CANCEL事件):

小总结:

onInterceptTouchEvent是自rootiew向下传递, onTouchEvent正好相反。

 

Oninterceptouchevent ontouchevent中的返回值truefalse都指的都是是否自己处理

 

 测试项目源码下载

http://download.csdn.net/detail/u012792689/8146185

Android开发群:213052613

0 0
原创粉丝点击