【Android】Touch事件分发
题外话:
/*** 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事件分发相关推荐
- Android Touch事件分发—拦截—处理
Android Touch事件分发(dispatchTouchEvent)-拦截(onInterceptTouchEvent)-处理(onTouchEvent) 转自:http://www.cnblo ...
- Android Touch事件分发(源码分析)
Android一文让你轻松搞定Touch事件分发 源码分析 下面,咱们一起通过源码,全面解析事件分发机制,即按顺序讲解: Activity事件分发机制 ViewGroup事件分发机制 View事件分发 ...
- Android触摸事件分发
Android的触摸分发机制和如何实现拦截 Android的触摸分发机制和如何实现拦截 前言 触摸事件的分发 情景分析 总结 前言 在自定义ViewGroup中,有时候需要实现触摸事件拦截,比如Lis ...
- android控件的touch事件_Android touch 事件分发时序
点击上方"蓝字"关注我们 1,touch 事件是如何从驱动层传递给 Framework 层的 InputManagerService: 2,WMS 是如何通过 ViewRooImp ...
- android touch事件无反应,android的touch事件分发响应机制
想要弄明白android的touch事件分发响应机制需要先充分理解一下几个知识点: View和ViewGroup touch事件的构成 ViewGroup如何对事件分发和拦截 View和ViewGro ...
- Android:30分钟弄明白Touch事件分发机制
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- View的Touch事件分发(一.初步了解)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 一次完整的Touch事件序列为: ACTION_DOWN -> AC ...
- android 点击事件消费,Android View事件分发和消费源码简单理解
Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...
最新文章
- 推荐15个国外使用 CSS3 制作的漂亮网站
- mybatis mysql crud_Mybatis的CRUD操作
- IOC的理解,整合AOP,解耦对Service层和Dal层的依赖
- uvm 形式验证_一种基于UVM的总线验证方法与流程
- 难点—在引用数组元素时指针的运算
- B端产品如何做好从1到10的架构搭建?
- pythondev更新到3_python版本升级到3.7
- pythonjava有什么区别_Python与JAVA有何区别?
- 对AIOps架构框架比较
- mysql组合索引与字段顺序
- 【渝粤教育】国家开放大学2018年秋季 8109-22T (1)货币银行学 参考试题
- VUE配置本地代理服务器
- UnDistort Audio File(音频修复软件)官方正式版V1.0 | 音频修复软件哪个好用 | 专业修复音频的软件
- 狄拉克量子力学原理【1】态叠加原理
- VB中 vbp vbw frm frx log bas 等扩展名大全
- Java操作excel锁定
- VMware copy之后,如何查看网卡地址 HWADDR
- 2002 计算球体体积
- -webkit-touch-callout禁止长按菜单
- 能转PDF格式用的在线软件