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方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
随机推荐
- win7 远程桌面连接centos 6.5
首先安装tigervnc-server: yum install tigervnc-server 安装好后,设置 vi /etc/sysconfig/vncservers 'man vncpasswd ...
- rtl-sdr在win7和ubuntu16.04的安装
硬件准备 RTL2832+R820T2 usb dongle x 1 Long wire antenna x 1 USB电视棒的购买: 在淘宝上搜索"软件无线电"或"rt ...
- JSONObject.parseObject(jsonStr);和JSONObject.fromObject(jsonStr);
虽然都是返回JSONObject,但是 JSONObject.parseObject(jsonStr);这个方法需要导入import com.alibaba.fastjson.JSONObject; ...
- windows修改环境变量
windows的环境变量有两套: 系统的 当前用户的 不同的用户可以拥有不同的环境变量,当前用户的环境变量优先级比系统的环境变量优先级高,PATH环境变量比较特殊,它不是替换而是拼接. 在命令行下也可 ...
- I/O事件处理模型之Reactor和Proactor 【转】
http://blog.ddup.us/?p=280 这篇博客说的很清楚,赞一个: 在编写服务端软件的时候,如何处理各种I/O事件是其中很重要的一部分.在Unix Network Programmin ...
- 对simhash算法的一些思考
http://2588084.blog.51cto.com/2578084/558873
- ubuntu远程桌面连接windows系统
现在用ubuntu系统,公司买了个windows的服务器,需要给配置一套环境,来回跑很麻烦,就想windows下可以的远程桌面,Linux应该也有. 现在自己的ubuntu13.10,无法进入桌面的“ ...
- List<String> bikeList = Arrays.asList(bikeuuids);
最近项目中 List<String> bikeList = Arrays.asList(bikeuuids);报错 而且console里面没有特别有用的 bikeList.add(&qu ...
- rviz学习笔记(一)——Markers: Sending Basic Shapes (C++) 发送基础形状
一.创建一个包——进行marker练习 1.创建ROS工作空间和包 mkdir -p ~/catkin_ws/src #创建工作空间目录 #创建ROS数据包 catkin_create_pkg usi ...
- HDU 4638 Group (线段树 | 树状数组 + 离线处理)
Group Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...