TouchEvent: dispatchTouchEvent(), onTouch() , onTouchEvent(), requestDisallowInterceptTouchEvent() 方法中的一些细节
Q: onTouchListener与onClickListener谁先执行?
A: onTouchListener中的内容先执行。若其中的onTouch方法返回true,代表该事件已被onTouch消费掉了,则onClick不会再执行。
Q: onTouch和onTouchEvent有什么区别?
A: 在某种情况下onTouch要先于onTouchEvent执行。onTouch是 onTouchListener 里的方法,若View已经设置了onTouchListener,且该View是 Enable 的,则会先尝试先调用onTouchListener中的onTouch方法,判断返回值。若onTouch方法返回false,则继续向下执行 onTouchEvent() 方法;若onTouch()方法返回true,则不再执行 onTouchEvent() 方法。
参考源码:
public boolean dispatchTouchEvent(MotionEvent event) {
    if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
            mOnTouchListener.onTouch(this, event)) {
        return true;
    }
    return onTouchEvent(event);
}
Q: onClick()方法是在哪里调用的?是如何调用的?
A: onClick()方法是在onTouchEvent()方法中调用的。大概的调用流程为:当收到 MotionEvent.ACTION_UP 事件后,经过层层判断,会跳转到到 performClick() 方法中,在该方法中会判断onClickListener
是否为null, 若不为null,则会调用 onClickListener 的 onClick 方法。
参考源码: onTouchEvent

performClick()
public boolean performClick() {
    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
    if (mOnClickListener != null) {
        playSoundEffect(SoundEffectConstants.CLICK);
        mOnClickListener.onClick(this);
        return true;
    }
    return false;
}
Q: 有些时候在自定义View中的onTouchEvent()方法里添加GestureDetector时,无法响应GestureDetector里的触摸事件,这是为什么?
A: 可能是由于该View无法 clickable 导致的。观察源码的 onTouchEvent 方法就可以发现,如果View要响应 ACTION_UP , ACTION_MOVE ...等等诸如此类事件,先决条件就是该View必须是 CLICKABLE 或
 LONG_CLICKABLE 的,二者满足其一即可。若二者皆不满足,则不会进入到接下来的 switch (event.getAction()) 代码块中。
参考源码:

Q: android里的Touch事件传递流程具体是怎么样的?
A: 当在屏幕上点击了一个控件,首先会去调用该控件所在的顶级布局中的 dispatchTouchEvent() 方法,然后在该方法中判断 if (disallowIntercept || !onInterceptTouchEvent(ev)) 
 disallowIntercept 代表的是否禁用掉当前View的事件拦截功能,默认是 false ;  onInterceptTouchEvent 代表的则是是否拦截其中的某一个事件,默认也是 false ,但是对onInterceptTouchEvent
进行了取反,也就意味着能够进入接下来的方法块当中,紧接着在该方法块中寻找符合点击位置的子控件,若找到了该子控件然后再去调用该子控件的dispatchTouchEvent()方法,最后调用该子控件的 onTouch 或
 onTouchEvent() 方法对事件进行处理。
参考源码:

这几个方法的主要作用在于:
dispatchTouchEvent  负责事件的分发,
onInterceptTouchEvent 和 disallowIntercept 用于控制具体的触摸事件是否需要向对下层过滤
onTouch和onTouchEvent 负责具体的事件处理
正常的事件流向(以MyTextView为例):

Q: requestDisallowInterceptTouchEvent方法是干什么用的?
A: 这个方法的主要作用是用于修改上面的 disallowIntercept 这个变量的值,该方法传入一个bool变量,若为true,则代表禁用掉当前View的事件拦截功能。
参考链接:
1.Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
2.Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
TouchEvent: dispatchTouchEvent(), onTouch() , onTouchEvent(), requestDisallowInterceptTouchEvent() 方法中的一些细节的更多相关文章
- View中的onTouchEvent()与setOnTouchListener()中的ontouch()方法的事件处理先后顺序
		
Touch事件的两种情况 1.覆写View.class中定义的onTouchEvent-->基于事件回调监听方式 @Override public boolean onTouchEvent(Mo ...
 - Android中onInterceptTouchEvent、dispatchTouchEvent及onTouchEvent的调用顺序及内部原理
		
在Android中需要经常对用户手势进行判断,在判断手势时需要精细的分清楚每个触摸事件以及每个View对事件的接收情况,在View,ViewGroup,Activity中都可以接收事件,在对事件进行处 ...
 - ViewGroup dispatchTouchEvent方法中 mFirstTouchTarget标志是否为空的含义
		
在ViewGroup dispatchTouchEvent方法中首次出现mFirstTouchTarget的语句为: if (actionMasked == MotionEvent.ACTION_DO ...
 - Android Touch事件之二:dispatchTouchEvent()和onTouchEvent()篇
		
2015-12-01 15:06:14 Android Touch事件第一篇:Touch事件在父ViewGroup和子View之间的传递简单分析了事件的传递流程,这次深入了解下dispatchTouc ...
 - 关于dispatchTouchEvent, onInterceptTouchEvent, onTouchEvent的分发机制浅析
		
虽说这个问题不是很难...动动手就能看出答案...但是似乎不太容易理解...几次尝试把这个问题说明白....但是好像感觉说不明白....(顿时想起了那句话----说不明白就是自己还不明白! 我怎么可能 ...
 - python方法中的self
		
前几天在写一个c作业时,突发奇想,在结构体中加入函数指针, 像这样: struct People { int _age; int (*age)(); }people; 这样调用时就可以 people. ...
 - 解决webkit浏览器中js方法中使用window.event提示未定义的问题
		
这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...
 - Don’t Use Accessor Methods in Initializer Methods and dealloc 【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】
		
1.问题: 在dealloc方法中使用[self.xxx release]和[xxx release]的区别? 用Xcode的Analyze分析我的Project,会列出一堆如下的提示:Inco ...
 - jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
		
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
 
随机推荐
- java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)
			
https://blog.csdn.net/my__sun_/article/details/74450241 读取文件的写法,相对路径 在当前的目录结构中读取test.txt的有四种写法 简单粗暴的 ...
 - 使用mapreduce来分析网站的log日志
			
近日,有人和我说分析log日志. 之前,就写过,但是忘了总结了,找了半天也没有找到,看了以后要将东西整理了. 无奈,在网上收拾,看到这个人写的,索性,就搬过来,待我找到我写的,在一块补充一下! 所有网 ...
 - tomcat启动dubbo报IO异常
			
严重: Servlet [springDispatcher] in web application [/dubbo-service] threw load() exception java.io.IO ...
 - 内存问题排查工具 --- valgrind
			
1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 4.1. 示例代码 4.2. Valgri ...
 - 推荐系统排序(Ranking)评价指标
			
一.准确率(Precision)和召回率(Recall) (令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表.) 对用户u推荐N个物品(记为R(u) ...
 - java struts2入门学习实例--用户注册
			
一.用户注册示例 register.jsp <%@ page language="java" contentType="text/html; charset=UT ...
 - syslog远程日志存储/514端口【转】
			
昨天在抓包的时候,发现在514端口,有SYSLOG字段的东西,不知道是用来干啥的,现在来分析一下: 其实他是在电脑间用了syslog远程日志存储,他用udp监控了514端口的数据流,之后收集整理日志: ...
 - Nginx防盗链的3种方法 文件防盗链 图片防盗链 视频防盗链 linux防盗链
			
Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性: 在高连接并发的情况下,Nginx是Apache服务器不错的替代品,目前Web服务器调查显示Apache下降Ngni ...
 - HDU  2067  小兔的棋盘 (卡特兰数)
			
小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
 - 新浪安装weiphp2.0的方法
			
请安装此网页的方法来安装: https://coding.net/u/idoubi666/p/weiphp-sae/git