前言

Android的点击事件分发一直是面试的高频问题,也涉及应用项目的多个地方,今天特此总结梳理一下这部分的知识

大纲

1.简介

2.结论

3.论证

4.其他问题

正文

1.简介

角色:Activity、ViewGroup、View

相关方法:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent

事件:DOWN、MOVE、UP、CANCEL...(在此主要讨论DOWN)

2.结论

真想用简短的一句话总结这么多东西的机制,但是还是有难度的,来个实际的应用题吧。

问:有个ActivityA、里面有个ViewGroupA、里面有个ButtonA,现在手指点击一下ButtonA,这个touch事件是怎么分发处理的?

答1:若ButtonA未注册onClick事件(未setOnClick):

DOWN事件流程:

ActivityA.dispatchTouchEvent() -> ViewGroupA.dispatchTouchEvent() -> ViewGroupA.onInterceptTouchEvent(默认不拦截)

-> ButtonA.dispatchTouchEvent() -> ButtonA.onTouchEvent()(不消费返回flase) 分发到view不消费开始上传

-> ViewGroupA.onTouchEvent() -> ActivityA.onTouchEvent()

点击事件未被任何view接受,因此后续的MOVE、UP事件也不会下发

MOVE或UP事件流程:

ActivityA.dispatchTouchEvent() -> ActivityA.onTouchEvent()

答2:若Button未注册onClick事件(设置setOnClick):

DOWN事件流程:

ActivityA.dispatchTouchEvent() -> ViewGroupA.dispatchTouchEvent() -> ViewGroupA.onInterceptTouchEvent(默认不拦截)

-> ButtonA.dispatchTouchEvent() -> ButtonA.onTouchEvent()(消费返回true)

有view消费,余下事件同样下发至此view

MOVE或UP事件流程:

ActivityA.dispatchTouchEvent() -> ViewGroupA.dispatchTouchEvent() -> ViewGroupA.onInterceptTouchEvent(默认不拦截)

-> ButtonA.dispatchTouchEvent() -> ButtonA.onTouchEvent() -> ButtonA.onClickListener

然后,当情况2时,如果在之前DOWN事件ViewGroupA中未拦截,在MOVE事件拦截了一次,即复写ViewGroupA.onInterceptTouchEvent返回true,那么ButtonA会收到一个CANCEL事件

3.论证

实际log论证下上面的情况,代码就不贴了,log标识的很清楚

答1.未注册btn setOnClick(view不消费)
dispatchTouchEvent()
TouchTestActivity -> TestLinearLayout -> TestButton

onTouchEvent
TouchTestActivity <- TestLinearLayout <- TestButton

答2.注册btn setOnClick(View消费)

 4.其他问题

1.Activity和View只有dispatchTouchEvent()和onTouchEvent()两种方法,ViewGroup有dispatchTouchEvent()、onTouchEvent()和onInterceptTouchEvent()三种方法

2.当Acitivty接收到Touch事件时,将遍历子View进行Down事件的分发。ViewGroup的遍历可以看成是递归的。分发的目的是为了找到真正要处理本次完整触摸事件的View,这个View会在onTouchuEvent结果返回true。

3.当某个子View返回true时,会中止Down事件的分发,同时在ViewGroup中记录该子View。接下去的Move和Up事件将由该子View直接进行处理。由于子View是保存在ViewGroup中的,多层ViewGroup的节点结构时,上级ViewGroup保存的会是真实处理事件的View所在的ViewGroup对象

4.当ViewGroup中所有子View都不捕获Down事件时,将触发ViewGroup自身的onTouch事件。触发的方式是调用super.dispatchTouchEvent函数,即父类View的dispatchTouchEvent方法。在所有子View都不处理的情况下,触发Acitivity的onTouchEvent方法。

5.onInterceptTouchEvent有两个作用:拦截Down事件的分发;中止Up和Move事件向目标View传递,使得目标View所在的ViewGroup捕获Up和Move事件。

6.在一次手势过程中,如果前面的事件父View没有拦截,这次事件父View拦截了,那么子View会马上收到一个ACTION_CANCEL事件

总结

以上就是对于点击事件分发机制的大致总结,详细还需根据源码做进一步更深层次的理解,并且结合自定义View演练一下已达到活学活用的效果

参考

https://www.jianshu.com/p/38015afcdb58

Android知识梳理:点击事件分发机制相关推荐

  1. Android6.0源码解读之ViewGroup点击事件分发机制

    本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系 ...

  2. Android面试老生常谈的 View 事件分发机制,看这一篇就够了

    本文首发我的微信公众号:徐公,想成为一名优秀的 Android 开发者,需要一份完备的 知识体系,在这里,让我们一起成长,变得更好~. 在 Android 开发当中,View 的事件分发机制是一块很重 ...

  3. Android 的触摸反馈以及事件分发机制

    在Android系统中,当你点击App某个按钮从你按下到抬起到底发生了什么? 要想解释这个问题首先需要了解Android的几个事件类型. Android 的事件类型分为以下四种: 1.MotionEv ...

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

    <div id="container">         <div id="header">     <div class=&qu ...

  5. Android 系统(199)---Android事件分发机制详解

    Android事件分发机制详解 前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析. ...

  6. Android的事件分发机制

    前言 Android事件分发机制是Android开发者必须了解的基础 网上有大量关于Android事件分发机制的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化等等 今天,我将把 ...

  7. 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...

  8. 浅谈Android事件分发机制

    在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...

  9. android 按键会触发ontouch吗?_这次,我把Android事件分发机制翻了个遍

    一名优秀的Android开发,需要一份完备的 知识体系,在这里,让我们一起成长为自己所想的那样~. 这次说下Android中的事件分发机制 从开始点击屏幕开始,就会产生从Activity开始到deco ...

  10. Android 系统(218)---Android的事件分发机制以及滑动冲突的解决

    Android的事件分发机制以及滑动冲突的解决 声明:  本文主要涉及VIew的事件分发与滑动冲突的解决,关于View的事件分发流程的部分内容参考自:  Android事件分发机制详解:史上最全面.最 ...

最新文章

  1. 云计算被视为继计算机,8+第八章+计算机网络技术分析.ppt
  2. MOCTF-Web-一道水题
  3. oracle32位11g中文乱码,win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决...
  4. 了解自定义De / Serializer:JSON绑定概述系列
  5. HDU2100 Lovekey【大数+进制】
  6. 中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动圆满结束
  7. Ubuntu18.04 上 phpvirtualbox 折腾记(二)
  8. Spring之IOC容器
  9. 计算机感染冲击波,CIH、爱虫、冲击波、熊猫烧香,对这4种网络病毒你了解多少?...
  10. 游戏开发完整学习路线,都在这里了
  11. 点到直线的距离直线的交点及夹角
  12. mac配置adb环境变量
  13. 高德地图哪个语音包最好_高德语音导航怎么呼叫?高德地图语音包怎么设置
  14. openGPS.cn - 高精度IP定位原理,定位误差说明
  15. 链路聚合、Trunk、端口绑定和捆绑简析
  16. 时间字符串转中国标准时间转时间戳转年月日格式
  17. 最容易被盗的密码,您有用过吗?
  18. 大数据方面的核心技术
  19. [POI2011]SEJ-Strongbox
  20. Centos7系统下部署Gitlab+Jenkins+Docker 实现自动化部署项目

热门文章

  1. ANSYS经典界面中梁单元实例全解析
  2. linux配置超时_自动退出登录TMOUT
  3. Python3 XML 解析
  4. 常用浏览器内核!IE,Chrome ,Firefox,Safari,Opera 等内核
  5. 设置共享后其他计算机无法访问,Win7局域网共享设置疑难大全(无法访问,没有访问权限,看不到共享电脑)...
  6. IT项目失败的常见原因分析
  7. java pdf添加图片_java pdf指定位置插入图片?
  8. 实验一. 路由器IP地址配置及直连网络
  9. 常用的前端框架有哪些?
  10. 衣服的尺寸S、M、L、XL、XXL分别表示的型号大小顺序是什么?