在之前的学习过程中只知道可以通过onTouchEvent方法来监听手指的落下、滑动、抬起,原来Android中还有个事件分发机制,所谓的事件分发机制实际上就是我们的ViewGroup与View处理相关操作的分配过程,当手指触摸屏幕,究竟是由ViewGroup来处理事件还是由View来处理事件,这就是我们的事件分发所要处理的问题了。
  关于Android的事件分发机制先来梳理一下思路。
  1、首先是事件分发机制的对象两个:ViewGroup+View。
  2、ViewGroup中有三个过程onInterceptTouchEvent(拦截事件)、dispatchTouchEvent(分发事件)、onTouchEvent(处理事件);View中只有两个过程:dispatchTouchEvent(分发事件)、onTouchEvent(处理事件)。
  3、还要注意的是这里的Touch事件,只限于Acition_Down事件,即触摸按下事件,而Aciton_UP和Action_MOVE却不会执行。Down方式通过dispatchTouchEvent分发,分发的目的是为了找到真正需要处理完整Touch请求的View。当某个View或者ViewGroup的onTouchEvent事件返回true时,便表示它是真正要处理这次请求的View,之后的Aciton_UP和Action_MOVE将由它处理。当所有子View的onTouchEvent都返回false时,这次的Touch请求就由根ViewGroup,即Activity自己处理了。
  4、不能单纯的理解ViewGroup下面的都是View,有可能ViewGroup下面还有ViewGroup,但是事件的分发机制还是一样的,在总的ViewGroup下面的ViewGroup还是会一样用于三个事件分发的处理过程
  过程图:
  
上面图片的过程就好像

大Boss说对部门领带说: 界面不美观,把页面添加个按钮,是不是会漂亮点?
部门领导对小组长说:界面加个按钮,可以吗?
小组长对某程序员说:界面需要添加个按钮,能做吗?
到此相当于我们的ViewGroup的dispatchTouchEvent的分发,先一层层询问是否分发,如果小组长(ViewGroup)说:可以,我来做。就相当与调用了拦截事件onInterceptTouchEvent,小组长将自己处理这个事情再进行OnTouchEvent事件,在此方法中进行具体的处理。

此时会出现两种情况:

程序员说:可以(程序员下面没有其他可以安排的人了,此时程序员相当于一个View)
程序员说:办不了
此时不论程序员是否能完成都会调用OnTouchEvent方法,如果返回的是true,则会接收并消费该事件。OnTouchEvent则会处理这个事件,并将结果返回给上一层级的ViewGroup,如果返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 ViewGroup 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回 false,这个事件就会“消失”,而且接收不到下一次事件。

dispatchTouchEvent介绍

dispatchTouchEvent方法用于事件的分发,Android中所有的事件都必须经过这个方法的分发,然后决定是自身消费当前事件还是继续往下分发给子控件处理。如果 return true,事件会分发给当前 View 并由 dispatchTouchEvent 方法进行消费,同时事件会停止向下传递。如果 return false,事件分发分为两种情况:如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的  onTouchEvent 进行消费。如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法,

ps:dispatchTouchEvent事件内部本身就会调用到onInterceptTouchEvent和onTouchEvent方法,可以看dispatchTouchEvent的源码

onInterceptTouchEvent介绍

  onInterceptTouchEvent是ViewGroup中才有的方法,View中没有,它的作用是负责事件的拦截,返回true的时候表示拦截当前事件,不继续往下分发,交给自身的onTouchEvent进行处理。返回false则不拦截,继续往下传。这是ViewGroup特有的方法,因为ViewGroup中可能还有子View,而在Android中View中是不能再包含子View的(iOS可以)。    

onTouchEvent介绍

   onTouchEvent方法用于事件的处理,返回true表示消费处理当前事件,返回false则不处理,交给子控件进行继续分发。

补充:
  这里有一个Android Touch事件分发机制的详细讲解,可以作为参考,很详细。
Android 编程下 Touch 事件的分发和消费机制
PS:不过感觉它里面所说的View是将整个Layout看做了一个ViewGrop,如果有嵌套的ViewGroup全部看做了View,因此有了他文章中所说的拦截事件的响应。

更多相关文章

  1. Android(安卓)Material Design之Snackbar
  2. Android上实现MVP模式的途径
  3. Android(安卓)文件存储
  4. Android核心分析 ------ 电话系统之rilD
  5. 在android 两个类之间 get,set方法传参使用
  6. Android输入输出机制之来龙去脉之前生后世
  7. Android(安卓)Activity之间跳转出现短暂黑屏的处理方法
  8. 一步步探索学习Android(安卓)Touch事件分发传递机制(一)
  9. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout

随机推荐

  1. Android 4.0 的 GridLayout
  2. android 重点
  3. android键盘事件
  4. android Scroller
  5. Android Activity启动慢
  6. Android滑动卡片效果:Swipecards
  7. android 手势识别
  8. Android中RadioGroup组与onCheckedChange
  9. Android Studio无法执行Java类的main方法
  10. Android 实现在Java代码中修改UI界面,并修