个人对Android Touch事件机制的理解

来源:互联网 发布:动力学仿真软件ls 编辑:程序博客网 时间:2024/06/05 20:17

首先,观看了以下两位大神的文章,获益匪浅,在此提供一下链接:

Android事件分发机制完全解析,带你从源码的角度彻底理解(上)

[Android应用]对GroupView中onInterceptTouchEvent方法的理解

 

而我个人关于Touch事件的理解:

android/frameworks/base/core/java/android/view/View.java


dispatchTouchEvent -> onTouch(setOnTouchListener) -> onTouchEvent

Android中touch事件的传递,先传递到ViewGroup,再传递到View

1. dispatchTouchEvent -- 事件分发的入口。会先判断onTouch结果,再判断onTouchEvent结果
 onTouch返回true的话,dispatchTouchEvent return true
 onTouch返回false的话,dispatchTouchEvent 与 onTouchEvent 返回值一致
 
2. 假如有设置OnTouchListener,onTouch就会执行;
 onTouch返回false的话,onTouchEvent就会执行
 onTouch返回true的话,touch事件相当于被消耗掉,onTouchEvent不会执行
 
3. 当View为Enabled和Clickable时,onTouchEvent就会进行Touch事件处理,并且返回true;否则返回false
 在ViewGroup中,onTouchEvent默认返回false
 在ACTION_UP事件中,假如有设置OnClickListener,就会执行onClick事件
 
 -----------------------------------------------------------------------------------------------------
android/frameworks/base/core/java/android/view/ViewGroup.java
1. onInterceptTouchEvent -- ViewGroup用于拦截传递给子View的Touch事件
 返回false,会处理子view的dispatchTouchEvent,接下来的每一个事件都会先传到onInterceptTouchEvent()
 返回true,子view的时间被拦截,会继续处理ViewGroup的dispatchTouchEvent,onTouch 和 onTouchEvent

2. ViewGroup中重写了dispatchTouchEvent方法,具体源码分析如下
http://www.2cto.com/kf/201412/365603.html

 

仅仅通过概览性的官方文档是很难理解onInterceptTouchEvent函数的用途的,只有通过演绎这个抽象的规则,配以图文才能获取这个重要的知识。
很显然,默认是返回false,不做截获。
返回true之后,事件流的后端控件就没有机会处理touch事件了。
把默认的事件流中每个处理函数看作一个节点,这个节点只要返回true, 后续的事件就被截止了,这样想就很好理解。

 

0 0