Android Touch 事件----MotionEvent介绍

单点触控

常见事件

事件动作
ACTION_DOWN=0手指 初次接触 到屏幕
ACTION_UP=1手指 离开屏幕 时触发
ACTION_MOVE=2手指在屏幕上滑动时触发,会随着手指移动,多次触发
ACTION_CANCEL=3事件被上层事件拦截时触发
ACTION_OUTSIDE=4事件一般是window设置了FLAG_WATCH_OUTSIDE_TOUCH时会收到相应回调

ACTION_CANCEL和ACTION_OUTSIDE出现场景

  • action_cancel 的触发条件是事件被上层拦截
    事实上如果事件被上层拦截,子view是收不到任何事件信息的,所以这里说的被 上层拦截 指的是上层在分发事件处理权后又回收了该处理权,那么此时之前被分配处理权的子view就会收到一个action_cancel的事件
    举个例子:
    • 上层一个listView 收到一个action_down的事件,因为接下来的事件不确定,可能是一个click事件,所以试图分发给itemView(itemView已接收action_down),但是此时收到的action_move事件与listView可滑动方向一致,那么此时listView则将此事件拦截,向之前itemView发送一个action_cancel事件
  • _action_outside_的触发条件是window设置了FLAG_WATCH_OUTSIDE_TOUCH
    正常情况下,如果在视图区域歪点击则该视图不可能收到任何事件,但是当视图的WindowManager设置了FLAGA_WATCH_OUTSIDE_TOUCH后,在点击视图外的区域时该视图会收到一个action_outside事件

常用函数

getAction()
获取事件类型,action_down/action_move等

getX()
获取触摸点相对于当前view的x坐标
getY()
获取触摸点相对于当前view的y坐标

getRawX()
获取触摸点相对于屏幕的x坐标
getRawY()
获取触摸点相对于屏幕的y坐标

多点触控

常见事件

事件动作
ACTION_DOWN=0第一个 手指 初次接触 到屏幕触发
ACTION_UP=1最后一个手指 离开屏幕 时触发
ACTION_MOVE=2手指在屏幕上滑动时触发,会随着手指移动,多次触发
ACTION_POINTER_DOWN=5多点时第2…n个手指按下(该手指按下时已经有手指在屏幕上)
ACTION_POINTER_UP= 6多点时非最后一个手指抬起(该手指抬起后屏幕上还有其他手指)

多点下的action表达方式

action是一个int型数据0x00000000,因此在多点模式下用最低8位表示事件类型(action:0x000000ff), 再往前的8位表示事件编号(actionIndex:0x0000ff00)

手指事件
第1个手指ACTION_DOWN(0x00000000)
第2个手指ACTION_POINTER_DOWN(0x00000105)
第3个手指ACTION_POINTER_DOWN(0x00000205)
第4个手指ACTION_POINTER_DOWN(0x00000305)
  • 多点时必须用getActionMasked() 获取事件类型,这样去掉了actionIndex的概念就可以跟标准事件类型比较
  • 单点时getAction和getActionMasked()得到的值是完全一样的
  • getActionIndex获取到的这个index值只在down和up时有效, move时是无效的

actionIndex 、pointerIndex和pointerId的关系

actionIndex即是getActionMasked()的次高8位,也是pointerIndex, 在获取pointer信息的时候,都是用的pointerIndex来指定哪个手指, 但是如上面所说,actionIndex只在down和up时有效,因此我们使用pointerId来作为事件追踪的依据, pointerId在手指按下时产生,在手指抬起或者事件取消后消失, 是一个事件流程中唯一不变的标识,可以通过getPointerId(int pointerIndex)来获取

历史数据批处理

一般我们手指在屏幕上稍微移动就会产生很多事件,为了提高效率,系统会将多个移动事件按照事件的发生顺序进行排序打包放到同一个MotionEvent中。因此历史数据中只有ACTION_MOVE事件。

方法介绍
getHistorySize()获取历史事件集合的大小
getHistoricalX(int pos)获取第pos个历史事件的x坐标(因没有指定pointerIndex, 这里默认是0)
getHistoricalY(int pos)获取第pos个历史事件的y坐标(因没有指定pointerIndex, 这里默认是0)
getHistoricalX(int pointerIndex int pos)获取第pointerIndex手指的第pos个历史事件的x坐标
getHistoricalY(int pointerIndex int pos)获取第pointerIndex手指的第pos个历史事件的y坐标
  • MotionEvent的方法中几乎所有的index都是只pointerIndex
  • 在方法调用时pointerIndex的范围是[0:getPointerCount()), pos的范围:[0:getHistorySize())

常用方法

getActionMasked()

  • 跟getAction()功能类似,多点触控时使用该方法获取事件类型,两者区别:
    getAction是获取的action的数值,getActionMasked获取的是去掉actionIndex的值,因此在单点情况下,两者获取的值相同都是标准的action值,但是在多点情况下两者获取到的值相差一个actionindex

getActionIndex()
获取该事件是哪个手指产生的,也即是pointerIndex

getPointerCount()
获取屏幕上一共有几个手指按下

getPointerId(int pointerIndex)
获取手指的唯一标识id, 该id就是在down和up之间唯一不变的那个id

findPointerIndex(int pointerId)
根据pointerId(唯一不变的那个id)获取当前状态下的pointerIndex

getx(int pointerIndex)
获取某个手指的x坐标, pointerIndex是手指的index,可以通过findPointerIndex(int pointerId)查询
getY(int pointerIndex)
获取某个手指的y坐标, pointerIndex是手指的index,可以通过findPointerIndex(int pointerId)查询

getSize()
获取第一个手指与屏幕的接触面积大小, 还有getSize(int pointerIndex), getHistoricalSize(int pos), getHistoricalSize(int pointerIndex, int pos)等变形

getPressure()
获取第一个手指的压力大小,同样也有 getPressure(int pointerIndex), getHistoricalPressure(int pos), getHistoricalPressure(int pointerIndex, int pos), 该方法需要硬件支持才可以使用,大部分设备是用接触面积来模拟getPressure的

event事件从down开始,到up结束,期间无论move是否在该view的区域内,仍然是该view的move回调

参考:
http://www.gcssloop.com/customview/motionevent

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值