Android事件分发(1)
来源:互联网 发布:怎么代理淘宝网店 编辑:程序博客网 时间:2024/05/29 18:51
由于遇到了ScrollView嵌套EditText的滑动冲突问题,想深入了解一下Android的事件分发机制到底是怎么回事,也做一个总结。
参考了部分郭霖的源码分析 Android事件分发机制完全解析,带你从源码的角度彻底理解
一、需要先理解两件事情
安卓事件事件分发主要用到了三个函数:
- dispatchTouchEvent(MotionEvent ev)
- onInterceptTouchEvent(MotionEvent ev)
- onTouchEvent(MotionEvent event)
可以看到三个函数的参数都是MotionEvent 类型的参数。
当用户进行点击,滑动,长按等操作的时候,会产生一系列的触屏事件。
这里需要理解的事情是:触屏事件是被当成了MotionEvent 对象在进行分发和处理的MotionEvent 对象简单来说定义了一些基础事件:
ACTION_DOWN:按下控件,代码0
ACTION_UP:手离开控件,代码1
ACTION_MOVE:手指移动,代码2
ACTION_CANCEL:触摸事件被取消了,代码3
还有其他,不列举了。
二、onTouch和onTouchEvent区别
看一下源码中的逻辑:
public boolean dispatchTouchEvent(MotionEvent event){ ... ... if(onFilterTouchEventForSecurity(event)){ ListenerInfo li = mListenerInfo; if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && li.mOnTouchListener.onTouch(this, event)) { return true; } if(!result && onTouchEvent(event)){ return true; } } ... ... return false; }
onTouch的执行:
if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event))一共有四个判断。
li != null 的判断一般都为真(源码中mListenerInfo赋值给了li,mListenerInfo在getListenerInfo()中赋值,getListenerInfo()在多个地方调用)
其次,li.mOnTouchListener是通过setOnTouchListener赋值的,如果设置了OnTouchListener,值为true
第三,(mViewFlags & ENABLED_MASK) == ENABLED 是判断控件是否是enable的,
第四,li.mOnTouchListener.onTouch(this, event)执行了 setOnTouchListener所设置的onTouch
然后可以看到onTouchEvent的执行:
if(!result && onTouchEvent(event))
A.假如result为true的话,!result 为false,判断到这里,if已经不成立了,所以onTouchEvent(event)没有执行
B.假如result为false的话,!result 为true,会执行onTouchEvent(event)
所以可以得出以下结论:
1. View在分发事件(dispatchTouchEvent中)的时候,优先对onTouch要不要执行进行了判断。
2. 如果 onTouch执行后,返回了true,触摸事件被消费,onTouchEvent(event)也就不再执行了。
3. View的源码中,只有setOnTouchListener对onTouch事件进行了赋值。onTouch是我们自己赋值进去的,几乎没做什么操作。
由此可以得出了几个个结论:、一是点击事件,滑动,长按等等事件的判断和实现,不是在onTouch中实现的,是在onTouchEvent(event)中实现的,因为onTouch事件默认是null的
二是,onTouch事件默认是null的,对于onTouch的赋值,是给用户提供了一个拦截onTouchEvent(event)的机会,联想到上一篇 ScrollView嵌套EditText的滑动冲突问题 ,解决问题的关键也是在 onTouchEvent发生之前,做了一些处理。
- Android事件分发(1)
- android事件分发(一)
- Android事件分发(三)
- android事件分发(二)
- Android事件分发 (一)
- Android事件分发(二)
- Android事件分发(二)
- android基础(事件分发)
- Android事件分发(2)
- Android事件分发机制(三)事件分发和消费
- Android事件分发(事件传递机制)
- 深入解析Android事件分发机制源码(1)
- Android TouchEvent事件分发机制详解(1)
- Android 事件分发机制详解(1)-View
- android事件分发机制学习1
- Android事件分发机制完全解析(1)
- android 事件分发传递机制(转)
- Android 事件分发机制(下)
- HashCode的作用原理和实例解析
- effect java 学习摘要(1)
- CSS(4)__CSS基本用法<三种定位>
- Linux入门命令
- 自定义控件——第一行代码3.4.2
- Android事件分发(1)
- LIBSVM在Matlab下的安装与简单使用
- springmvc学习笔记2
- 回文子串
- spring-boot单元测试
- 吃糖果—抽屉原理
- 一周小结
- 【每日一题-13】二叉树中查找节点/子树
- [Java Web]Web请求过程之二:DNS 域名解析