本文仅介绍 MotionEvent 中 action actionMasked 两者在使用上的区别
相同点:
都表示此次MotionEvent的事件类型-手指按下/移动/抬起
不同点:
action 无法直接识别第二根手指的按下与抬起,而 actionMasked 可以。action 的类型有 按下、移动、抬起,而 actionMasked 有额外两种类型:
ACTION_POINTER_DOWN - “已经有手指按着了,又按下了新手指”
ACTION_POINTER_UP - “手指抬起了,但仍有其它手指按着”
使用建议:
action比actionMasked少了多指识别,适合"检测点击位置"、"记录按下时间"这种只涉及按下抬起的动作。
对于单指拖拽动作要确保用户只用一根手指,不会出现类似“按下第二根手指后抬起第一根手指,继续拖拽”这种临时多指的动作,否则位置会跳。
actionMasked比action更全面,无论处理简单拖拽还是复杂的多指事件都适用。
附上事件翻译:
fun parseActionString(actionMasked: Int): String {
return when (actionMasked) {
MotionEvent.ACTION_DOWN -> "按下"
MotionEvent.ACTION_POINTER_DOWN -> "按下(已有其它触摸点)"
MotionEvent.ACTION_MOVE -> "移动"
MotionEvent.ACTION_POINTER_UP -> "抬起(仍留其它触摸点)"
MotionEvent.ACTION_UP -> "抬起"
MotionEvent.ACTION_CANCEL -> "取消"
else -> "未知"
}
}
额外(反正写都写了) - 触摸点的简单使用:
单指动作可以忽略触摸点系列逻辑,触摸点只用于多指动作。
按下第一根手指便出现第一根触摸点,继续按下第二根手指就会出现第二根触摸点,触摸点可以有很多个,都能用MotionEvent拿到。
event.pointerCount //屏幕上触摸点总数
MotionEvent提供了用触摸点索引拿到触摸点信息的API
event.getX(index) //通过索引拿坐标
但触摸点索引会随着触摸点消失和出现变化,不能做触摸点的唯一标识。而触摸点id不会变,所以方案就是当按下时记录触摸点id,用id拿到索引再拿其他信息
event.getPointerId(pointerCount-1) //拿到刚出现的触摸点id
event.findPointerIndex(id) //通过id拿索引