题外话:

 /*** A ViewGroup is a special view that can contain other views* (called children.) The view group is the base class for layouts and views* containers. This class also defines the* android.view.ViewGroup.LayoutParams class which serves as the base* class for layouts parameters.

一个ViewGroup是一个可以包含其他view的特别的View(是View的子类),ViewGroup是各个Layout和View组件的基类,这个类还定义了LayoutParams类来指定这个基类的布局参数。

正题:

之所以先了解一下ViewGroup,是因为ViewGroup是了解一个界面组织的基本元素,只有知道这个元素,我们才好描述Touch事件的分发。关于Touch事件的分发,很多人都做过研究,比如Android中OnTouch事件的研究:

在触发OnTouch事件的时候Android的GroupView会调用如下三个函数:

1 public boolean dispatchTouchEvent(MotionEvent ev) 用于事件的分发
2 public boolean onInterceptTouchEvent(MotionEvent ev) 用于事件的拦截
3 public boolean onTouchEvent(MotionEvent ev)  处理事件

当然我们可以在容器类中如继承自LinearLayout的类中重写这三个方法。而继承View类的子类只能重写dispatch和onTouchEvent两个方法。当点击后这三个方法相继执行。

自己写了一个TextView子类MyTextView和LinearLayout子类MyLinearLayout,TextView包含在LinearLayout中。

  当点击MyTextView时,程序会先进入到LinearLayout的dispatchTouchEvent中,这个类必须调用super.dispatchTouchEvent(ev); 否在后面的两个方法无法触发,所以傻蛋发现这个方法根本没有必要重写,因为框架是在super.dispatchTouchEvent(ev);中来调用onInterceptTouchEvent和onTouchEvent方法的,所以手动的设置dispatchTouchEvent的返回值是无效的,除非你不想让框架触发这两个方法。

当执行完dispathTouchEvent后会执行onInterception方法,如果返回为true,这表示MyLinearLayout把这个Touch事件拦截了,就会执行自己的OnTouch方法。如果为false则表示不拦截,此事件会分发到把事件传递给它的子控件MyTextView中。

当事件传递到MyTextView后,会执行dispatchTouchEvent,然后会执行onTouchEvent。当在MyTextView中的onTouchEvent返回为false的话,当执行完onTouchEvent中的事件后,事件会再分发给MyLinearLaytout,执行LinearLayout的onTouchEvent。

博客作者(傻蛋?)使用一个LinearLayout和一个TextView来做实验,我们可以得出如下的结论:

1)事件的初始触发者是父组件(LinearLayout),父组件有权决定是分发这个事件还是拦截这个事件;

2)如果父组件分发这个事件,则子控件会收到这个事件,子控件调用onTouchEvent方法处理事件,如果onTouchEvent返回的是false,则事件还会交给父组件处理。

总结论是:

Android的触摸事件分发是从最上层的Activity开始的,然后dispatch到子View,当分发到触发事件的View时,再逐层往回调用onTouchEvent函数,下面是实例代码。

更明白一点:

Android 消息队列的分发流程是:Activity  ->  ViewGroup1  -> ViewGroup1的直接子ViewGroup –> ××××××  -> 叶子View

消息处理流程,从子到父,如果消息处理一直返回的是 false。则一直是从子到父的依次处理。处理到没有可以处理的人了,或者返回了true到此为止。

(还需要继续,自己实验,自己研究源码)

转载于:https://www.cnblogs.com/lqminn/archive/2012/09/25/2701171.html

【Android】Touch事件分发相关推荐

  1. Android Touch事件分发—拦截—处理

    Android Touch事件分发(dispatchTouchEvent)-拦截(onInterceptTouchEvent)-处理(onTouchEvent) 转自:http://www.cnblo ...

  2. Android Touch事件分发(源码分析)

    Android一文让你轻松搞定Touch事件分发 源码分析 下面,咱们一起通过源码,全面解析事件分发机制,即按顺序讲解: Activity事件分发机制 ViewGroup事件分发机制 View事件分发 ...

  3. Android触摸事件分发

    Android的触摸分发机制和如何实现拦截 Android的触摸分发机制和如何实现拦截 前言 触摸事件的分发 情景分析 总结 前言 在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如Lis ...

  4. android控件的touch事件_Android touch 事件分发时序

    点击上方"蓝字"关注我们 1,touch 事件是如何从驱动层传递给 Framework 层的 InputManagerService: 2,WMS 是如何通过 ViewRooImp ...

  5. android touch事件无反应,android的touch事件分发响应机制

    想要弄明白android的touch事件分发响应机制需要先充分理解一下几个知识点: View和ViewGroup touch事件的构成 ViewGroup如何对事件分发和拦截 View和ViewGro ...

  6. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  7. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  8. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  9. View的Touch事件分发(一.初步了解)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 一次完整的Touch事件序列为: ACTION_DOWN -> AC ...

  10. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

最新文章

  1. 推荐15个国外使用 CSS3 制作的漂亮网站
  2. mybatis mysql crud_Mybatis的CRUD操作
  3. IOC的理解,整合AOP,解耦对Service层和Dal层的依赖
  4. uvm 形式验证_一种基于UVM的总线验证方法与流程
  5. 难点—在引用数组元素时指针的运算
  6. B端产品如何做好从1到10的架构搭建?
  7. pythondev更新到3_python版本升级到3.7
  8. pythonjava有什么区别_Python与JAVA有何区别?
  9. 对AIOps架构框架比较
  10. mysql组合索引与字段顺序
  11. 【渝粤教育】国家开放大学2018年秋季 8109-22T (1)货币银行学 参考试题
  12. VUE配置本地代理服务器
  13. UnDistort Audio File(音频修复软件)官方正式版V1.0 | 音频修复软件哪个好用 | 专业修复音频的软件
  14. 狄拉克量子力学原理【1】态叠加原理
  15. VB中 vbp vbw frm frx log bas 等扩展名大全
  16. Java操作excel锁定
  17. VMware copy之后,如何查看网卡地址 HWADDR
  18. 2002 计算球体体积
  19. -webkit-touch-callout禁止长按菜单
  20. 能转PDF格式用的在线软件

热门文章

  1. An Implementation of Double-Array Trie
  2. vmx转换ofv模板,导入esxi
  3. WebVie打开woffice文档
  4. jsp页面定义的map
  5. iOS开发之简单画板实现
  6. 子数组最大值设计02
  7. linux下c++實現簡單的生產者消費者隊列模式
  8. hadoop/hive/hbase 简单区别及应用场景
  9. (原創) 深入探討blocking與nonblocking (SOC) (Verilog)
  10. 基于图像分析的铁路车号识别系统