目录
6.2 相关核心方法返回true或者false,各有什么含义?
6.3 View的enable和clickable的属性值为true或者false有什么区别?
注意:本文只讨论Android Framework已经实现的Touch事件分发过程,暂不讨论工程师对相关类的继承、方法的重写。
1.Touch事件分发--简介
目前,用户与手机的交互方式以touch(手指触摸屏幕)为主。
用面向对象的思维解释“touch事件分发”,“touch事件”是一个对象,在Android中就是一个MotionEvent类型的实例;“分发”是方法的调用过程,MotionEvent对象作为方法的参数传递给所调用的方法。
MotionEvent对象记录了touch事件类型、发生此touch事件的位置坐标等。
举个例子,当用户触摸手机屏幕上的一个button,然后系统给出一个动态的反馈。从触摸到反馈,泛而谈之,处理流程如下:
2.Touch事件分类
类型 | 描述 |
---|---|
ACTION_DOWN | 手指按下,以下简称down |
ACTION_UP | 手指抬起,以下简称up |
ACTION_MOVE | 手指滑动,,以下简称move |
ACTION_POINTER_DOWN | 多个手指按下 |
ACTION_POINTER_UP | 多个手指抬起 |
ACTION_CANCEL | 取消事件 |
手指从按下,再经过移动,最后抬起,走完一个完整的touch事件流程,即down>move>move>move>move>move>move>up。
手指每触碰到一个位置,都会产生一个MotionEvent对象,并分发下去。
3.参与touch事件分发的视图层级
Activity中有一个PhoneWindow实例,PhoneWindow是抽象类Window的唯一子类。
PhoneWindow中有一个DecorVIew实例,DecorVIew是FrameLayout的子类,本质是一个ViewGroup,DecorVIew是界面的根视图。常见地,在Activity#onCreate()中调用setContentView就是设置DecorVIew的子视图。
touch事件分发的入口是Activity的dispatchTouchEvent(MotionEvent event)方法。
4.参与touch事件分发的核心类和方法
类 | 方法 |
---|---|
Activity | dispatchTouchEvent onTouchEvent |
ViewGroup | dispatchTouchEvent onInterceptTouchEvent onTouchEvent(继承View的) |
View | dispatchTouchEvent onTouchEvent |
View的onTouch和onClick监听需要工程师在外部实现,在最后讨论
5.读源码
了解了touch事件分发的基本概念之后,那就开始读源码吧。
读源码秘诀:注重主干,选择性忽略细微的实现;带着问题去读源码比较有针对性,始终记得主线