Android事件分发理解
Android事件分发机制是个难点和重点,结合下各家,写点自己的理解。。
首先抛出一个小问题,写一个button的点击事件
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Log.d("TAG", "onClick execute");
再写一个button的touch事件
- button.setOnTouchListener(new OnTouchListener() {
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- Log.d("TAG", "onTouch execute, action " + event.getAction());
- return false;
- }
- });
结果:
如果把ontouch方法返回值改为true,结果:
这是为什么?你先可以理解为返回true被消费了,不会往下传递了。
你触摸到了任何一个控件,就一定会调用该控件的dispatchTouchEvent方法。那当我们去点击按钮的时候,就会去调用Button类里的dispatchTouchEvent方法,可是你会发现Button类里并没有这个方法,那么就到它的父类TextView里去找一找,你会发现TextView里也没有这个方法,那没办法了,只好继续在TextView的父类View里找一找,这个时候你终于在View里找到了这个方法,示意图如下:
然后我们来看一下View中dispatchTouchEvent方法的源码:
- public boolean dispatchTouchEvent(MotionEvent event) {
- if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
- mOnTouchListener.onTouch(this, event)) {
- return true;
- }
- return onTouchEvent(event);
- }
看这个就明白了:刚才我们修改的outouch()方法return true,那么就走上面的if语句,被消费了没有执行click方法,如果outouch()ruturn false,那么dispatchTouchEvent()就ruturn onTouchEvent(event),说明了click方法一定在outouchEvent方法里面,点进去看下,果然
- public boolean performClick() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- if (mOnClickListener != null) {
- playSoundEffect(SoundEffectConstants.CLICK);
- mOnClickListener.onClick(this);
- return true;
- }
- return false;
- }
****************************************************************************************************************************
接下来我们看一个图
注意:
- 目前所有的图的事件是针对ACTION_DOWN的,对于ACTION_MOVE和ACTION_UP后面再说。
然后总结一下:1.有三层,Activity,ViewGroup,View, 然后呢,分别是dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,理解为分发,拦截,消费,因为Activity和view在最上和最底层,所以没有onInterceptTouchEvent.
2,接下来认真看下图,有三种返回值,return true,return false, return super,如果只走return super的话那么就是一个U型,整个流程应该是Activity---->ViewGroup--->View 从上往下调用dispatchTouchEvent方法,一直到叶子节点(View)的时候,再由View--->ViewGroup--->Activity从下往上调用onTouchEvent方法。
只要分析dispatchTouchEvent它的四条线路就可以理解这幅图
3.线路1:dispatchTouchEvent和onTouchEvent只要是返回true就是被消费了,没了,不会往下传了
4.线路2:dispatchTouchEvent和onTouchEvent只要是返回false就会回溯给父空间的onTouchEvent处理,类似递归停止开始回溯。
5.dispatchTouchEvent返回super.XXXX()那么就会交给这个ViewGroup的onInterceptTouchEvent 来处理,onInterceptTouchEvent (意思拦截,就是ViewGrouo分发的时候,问一问要不要拦截,如果拦截返回true,如果不拦截返回false,默认return super.onInterceptTouchEvent()就是return false),这里面再分两条路,线路3:到了onInterceptTouchEvent 返回true表示拦截,那么意思说自己要处理,就传给自己的onTouchEvent处理,线路4:onInterceptTouchEvent 默认或者返回false那么就交给子view的dispatchTouchEvent
6.这个时候有人可能会有疑问,子view没有onInterceptTouchEvent ,那么怎么给它的onTouchEvent呢,为了让View可以把事件分发给自己的onTouchEvent,View的dispatchTouchEvent默认实现(super)就是把事件分发给自己的onTouchEvent
*************************************************************************************************************************8
关于ACTION_MOVE 和 ACTION_UP
Android事件分发理解的更多相关文章
- 通俗理解Android事件分发与消费机制
深入:Android Touch事件传递机制全面解析(从WMS到View树) 通俗理解Android事件分发与消费机制 说起Android滑动冲突,是个很常见的场景,比如SliddingMenu与Li ...
- [转]Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android事件分发机制 该篇文章出处:http://blog.csdn.net/guolin_blog/article/details/9097463 其实我一直准备写一篇关于Android事件分 ...
- 【转】Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9153761 记得在前面的文章中,我带大家一起从源码的角度分析了Android中Vi ...
- Android事件分发机制浅谈(一)
---恢复内容开始--- 一.是什么 我们首先要了解什么是事件分发,通俗的讲就是,当一个触摸事件发生的时候,从一个窗口到一个视图,再到一个视图,直至被消费的过程. 二.做什么 在深入学习android ...
- Android事件分发机制(下)
这篇文章继续讨论Android事件分发机制,首先我们来探讨一下,什么是ViewGroup?它和普通的View有什么区别? 顾名思义,ViewGroup就是一组View的集合,它包含很多的子View和子 ...
- Android事件分发机制(上)
Android事件分发机制这个问题不止一个人问过我,每次我的回答都显得模拟两可,是因为自己一直对这个没有很好的理解,趁现在比较闲对这个做一点总结 举个例子: 你当前有一个非常简单的项目,只有一个Act ...
- Android事件分发机制源码分析
Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...
- 【自己定义控件】android事件分发机制
自己定义Viewgrou中我们或许会常常碰到这种情况,2个子控件的事件冲突导致滑动没实用了.滑动反应非常慢,点击没用了,要划非常多次才移动一点点等等.或许我们第一反应就是百度,google去搜索下答案 ...
- Android 事件分发机制具体解释
很多其它内容请參照我的个人网站: http://stackvoid.com/ 网上非常多关于Android事件分发机制的解释,大多数描写叙述的都不够清晰,没有吧来龙去脉搞清晰,本文将带你从Touch事 ...
随机推荐
- web前端面试题记录
记录了2017年5月下旬刚毕业时面试的经典面试题 布局方面 1. 响应式布局,左侧栏目固定,右侧内容随着屏幕宽度变化而变化(高频) flex布局 position布局 css3计算宽度 float布局 ...
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...
- eclipse如何导入项目和文件
在左侧创建项目区,右击鼠标-->选择Import-–>General-> Existing Projects into workPlace-->选择最下方Next-->点 ...
- docker - win7下构建swarm nodes实现跨host的容器之间的通信
前言 之前在Linux环境下尝试了swarm,通过将不同host以swarm nodes 的方式连接到一起(构建Overlay 子网),从而实现跨host的container通信. 今天我们就来说说如 ...
- xfire调用webservice接口的实现方式
package com.test; import java.net.URL; import org.codehaus.xfire.client.Client; import org.codehaus. ...
- ex3多类问题和NN中的前向传播
昨日去了趟无锡,前天下了暴雨,所以昨天给我的感觉天气很好,天蓝云白的,以后在这边学习估计也是一件很爽的事情,且昨日通知书业寄到学校了,附赠了一份研究生数学建模的传单,我搜了搜近几年的题目,感觉统计 ...
- python 标准库 -- signal
signal 的核心是 : 设置信号处理函数. 预定义信号 signal.SIG_DFL signal.SIGBUS signal.SIGFPE signal.SIGIO signal.SIGPOLL ...
- Redis客户端管理工具,状态监控工具
TreeNMS是一款Redis web客户端管理工具,采用JAVA开发,实现基于web方式对Redis数据库进行管理.监控.数据维护. 功能包括:数据库的状态监控,库表的展示,key,value的展示 ...
- 你不知道的 flex 技巧
一.使用 Auto Margins 对齐 不需要给图片使用任何的 flex,也不需要给父容器设置 space-between,只需要给 ' BUY-BUY-BUY' 按钮设置 margin-left: ...
- 如何相互转换逗号分隔的字符串和List
将逗号分隔的字符串转换为List 方法 1: 利用JDK的Arrays类 [java] view plain copy ico_fork.svg1.5 KB String str = " ...