开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第29天,点击查看活动详情
引入
Activity是如何响应对其中的某个视图的触控操作呢?
答:MotionEvent机制(触屏)
触屏操作的理解
- down:手指按下
- move:手指在屏幕上移动
- up:手指从屏幕上离开
正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,考虑如下几种情况:
- 点击屏幕后离开松开,事件序列为down->up;
- 点击屏幕滑动一会再松开,事件序列为down->move->...->move->up。
相关API
1.MotionEvent:屏幕事件
int ACTION_DOWN=0:代表dowm
int ACTION_MOVE=2:代表move
int ACTION_UP=1:代表up
getAction():得到事件类型值
getX():得到事件发生的x轴坐标(相对于当前视图)
getY():得到事件发生的y轴坐标(相对于当前视图)
getRawX():得到事件发生的x轴坐标(相对于屏幕左顶点)
getRawY():得到事件发生的y轴坐标(相对于屏幕左顶点)
2.Activity
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean :分发事件
override fun onTouchEvent(ev: MotionEvent?): Boolean :处理事件的回调
3.View
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean :分发事件
override fun onTouchEvent(ev: MotionEvent?): Boolean :处理事件的回调
setOnClickListener(l:OnClickListener):设置点击监听
setOnLongClickListener(l:OnClickListener):设置长按监听
setOnCreateContextMenuListener(l:OnCreateContextMenuListener):用于创建菜单
4.ViewGroup
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean :分发事件
触摸事件的分发与处理
- 事件产生的顺序为:down->move->...->move->up
- 事件对象被系统创建后,首先会调用对应Activity对象的dispatchTouchEvent()进行分发
- down在分发给视图对象的过程中要确定消费者(onTouchEvent()返回true),如果都返回false,那么事件的消费者只能是Activity了。
- 后面的move和up事件,将事件分发给消费者(可能是视图对象,也可能是Activity)
- 当前事件的消费者只能决定了下一个事件优先交给它处理
- 每个事件都需要有一个消费者