Android事件分发机制

Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()

  • 首先
    先简单了解Android事件处理的过程,以及Android中的以上三个方法的作用.
  1. 事件处理 :
    从用户开始到结束分为两个部分( 分为按下down , 抬起 up 两个部分) 简单附一张图,很好理解.这里就是简单的大家对手机,平板,iPad等的操作.从触摸开始到离开,就是这样的过程.
    在这里插入图片描述
    注:
    (1): 事件分发的本质?
    将点击事件(MotionEvent)向某个View进行传递并最终得到处理.
    (2): 事件在哪些对象之间进行传递?
    Activity、ViewGroup、View .
    Android的UI界面是由Activity、ViewGroup、View及其派生类组合而成的.额,就是下面的这张图.
    在这里插入图片描述

2.事件分发过程由哪些方法协作完?
(1) 接下来就是本次的核心: dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent() ;
(2) 我们姑且 将其逐次进行翻译:dispatchTouchEvent() —> 分发事件
onInterceptTouchEvent()—>拦截事件
onTouchEvent()---->处理事件
(3) 赋上三个方法的作用
在这里插入图片描述

  • 其次
    简单的了解了事件处理的过程以及其中三个共同协作的方法,接下来就是如何详细理解其中的运作过程.

这里有个小故事:可以模拟Android中的事件传递

 话说一家软件公司,来一个任务,分派给了开发经理去完成:

开发经理拿到,看了一下,感觉好简单,于是

开发经理:分派给了开发组长

开发组长:分派给了自己组员(程序员)

程序员:分派给了自己带的实习生。

实习生:好苦逼,无法分派,怎么办啊?只能自己干了

但是实习生能不能做好,有两种情况了。

情况一:

实习生:经过一段时间的研究,琢磨,熬夜,奋斗,死敲,皇天不负有心人啊,完成了。

后来又来一个类似的任务,也按着这样传递下去了(开发经理->开发组长->程序员->实习生),又有实习生完成了。

情况二:

实习生:经过一段时间的研究,琢磨,就是毫无头绪,无法完成,只能求教师傅(程序员)了。

程序员:啊,我怎么没留意就给实习生搞了,这任务好难啊,自己研究下,也没有头绪,没办法只能请求组长了。

开发组长:这任务不难啊,怎么我底下的人都不会了,没办法,只能自己搞了,经过,一段时间,完成了,感想,以后要是又有跟这个很类似的任务,我就自己弄了,不给他们弄了。

后来又来一个类似的任务,传递是这样的

开发经理:分派给开发组长

开发组长:啊,又是跟着上一个很类似的任务,我自己弄吧,没过多久也完成了!

其上分发,分派就是我们的主人公之一dispatchTouchEvent()方法
在分派任务的时候,这些经理,开发组长,程序员,可以拦截 即 [ onInterceptTouchEvent()]方法
他们每个人都可以拥有处理事件的能力即[ onTouchEvent() ] 方法
归结一下:
他们全部拥有分发和处理的能力,只不过拦截的话,需要你有下一级的接受对象,否则你不可以拥有拦截的方法.程序中各种基类都可以自己决定是否处理事件,只不过默认这些方法返回值为false.即不处理,继续下一层的分发任务.
在这里插入图片描述
在这里插入图片描述

这里是我们模拟的事件主人公在模拟器中的位置,比较直观
在这里插入图片描述

其实到这里就差不多结束了,这个故事还是蛮生动的,大家可以联想着记忆其中的方法,当点击事件冲突的时候,就需要我们认真分析其中的方法的冲突了…

…接下来就是事件传递的两种情况:(传递到最底层 和 半路就被人消费)
在这里插入图片描述
在这里插入图片描述

第二张图少了一个传递…忘记修改了…暂且这样…
最后在归结下:

1.事件是先有dispatchTouchEvent分派给下一级

2.要经过onInterceptTouchEvent是否需要拦截,不拦截传递给下一级,最终传递给view控件,

3.onTouchEvent方法中,在处理事件中,如果返回True,则表示能处理,传递将会终止。反着,不能,如果不能的话,这会返回上一级的onTouchEvent方法中,如果还是false,会一直到到上一层的onTouchEvent方法中。


以上是我个人愚见,
补充说明: <以下为代码出处,感谢大家收看!>

http://download.csdn.net/detail/chenjie_920/8398413

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值