快速理解android事件传递拦截机制概念

原创 2016年05月30日 21:37:12

listview与scollview嵌套使用过的小伙伴一定烦心过其滑动事件的麻烦。

打个比方:

假如有3个布局,Scollview A ,Scollview B,ListView C,B是A的子部局,C是B的子部局。ABC三者都是垂直滑动,那么当我触摸手机向下滑动的时候,滑动的是哪个view呢?

倘若明白了android事件分发机制,这些就很容易理解了。 


以下为部分原理:(经常碰到的方法是“事件拦截”和“事件响应”)

ViewGroup中的三个方法:

事件分发(dispatchTouchEvent(MotionEvent ev))

事件拦截(onInterceptTouchEvent(MotionEvent ev))

事件响应(onTouchEvent(MotionEvent ev))

View中只有两个方法:

事件分发(dispatchTouchEvent(MotionEvent ev))

事件响应(onTouchEvent(MotionEvent ev))


三个方法的调用流程大致如下:



看到几个函数眼花缭乱?完全没关系!笔者将用更通俗易懂的方式解释一遍。

我们还是举一个例子:

LinearLayout A ,Scollview B,ListView C

B是A的子部局,C是B的子部局


当发生触摸事件,事件的分发次序如下:A->B->C

当分发事件结束,事件开始处理,次序如下:C->B->A


在《Android群英传》中有比较形象的比喻,在此引用一下,希望帮助大家理解:

假设A为总经理,B为部长,C为员工。

一旦有事情,A会通知B,然后B通知C。

事件分发完毕后,从C开始执行。C做完了自己的事情,就通知B,然后B通知A。


那么再讨论一种情况,倘若我只想要第一个A获取到点击事件,而B和C不用滑动呢

A直接可以在事件分发的时候就 不告诉B和C有这个事件的发生。

也就是最终是:A接收,A不分发事件,A处理事件。


那么倘若A不仅仅自己要可以获取到触摸事件,而且还要B可以滚动,但是却不想要C和B造成滑动冲突呢?

这次就可以让B不告诉C事件的发生。

最终事件分发次序如下:A->B

事件处理次序如下:B->A


当然还有一种与上述两种完全不同的情况,我们不希望A的触摸事件执行,但是B和C却需要获取到触摸事件。

这次就可以让B在处理事件之后,不告诉A。

最终事件分发次序如下:A->B->C

事件处理次序如下:C->B



此篇文章更注重概念的理解,如果读者有兴趣,可以再查看以下两篇文章。

Android 事件分发

此篇文章使用log打印的方式解释。

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

此篇文章从源码角度解释。



版权声明:本文为博主许佳佳原创文章,转载请务必注明出处。

Android:学习AIDL,这一篇文章就够了(上)

前言 在决定用这个标题之前甚是忐忑,主要是担心自己对AIDL的理解不够深入,到时候大家看了之后说——你这是什么玩意儿,就这么点东西就敢说够了?简直是坐井观天不知所谓——那样就很尴尬了。不过又转念...
  • koozxcv
  • koozxcv
  • 2016年10月10日 11:12
  • 589

手把手教你从零开始做一个好看的 APP

前言:从零开始,手把手带你实现一个「专注睡前的 APP」。睡觉之前如果能有一个 APP,能让我们写一写这一天的见闻或者心得,同时又能看一会段子、瞄一会好看的妹子,放松一下疲惫的身心那该多好,这也是我完...

android 事件分发机制 概念理解

android 事件分发机制 参考资料 Android 事件分发机制源码和实例解析Android View 事件分发机制详解图解 Android 事件分发机制图解View的事件分发机制原理 分发事...

android 快速理解事件分发机制

事件的触发成功其实有三个坎,只有这三个坎都过了才能让我们见到他的触发效果。那么到底是哪三个方法阻 碍了事件的分发呢??下面我先一个一个的介绍,当然这里触发的顺序也是按数序。 一.onIntercept...
  • kluing
  • kluing
  • 2014年12月28日 20:09
  • 376

android Touch事件传递机制

  • 2015年01月26日 17:33
  • 4.76MB
  • 下载

Android事件传递机制测试代码

  • 2014年03月30日 18:31
  • 1.41MB
  • 下载

android触摸传递机制 - 拦截、事件分发

触摸拦截: android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTIO...

Android onTouch事件传递机制

  • 2017年02月28日 17:05
  • 27.68MB
  • 下载

Android TouchEvent 事件传递机制简单理解

Android事件传递机制是一个常用的知识点,在看过很多资料后,我也记录下我对事件传递机制的理解。 Android事件传递机制就是当一个触摸事件发生后,从一个窗口到另一个视图,再到另一个视图直到被消费...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速理解android事件传递拦截机制概念
举报原因:
原因补充:

(最多只允许输入30个字)