[Android]视图的触控操作MotionEvent

88 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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)
  • 当前事件的消费者只能决定了下一个事件优先交给它处理
  • 每个事件都需要有一个消费者