type
status
date
slug
summary
tags
category
password
icon
MotionEvent.getActionMasked()
常见值:
- ACTION_DOWN
第⼀个⼿指按下(之前没有任何⼿指触摸到 View)
- ACTION_UP
最后⼀个⼿指抬起(抬起之后没有任何⼿指触摸到 View,这个⼿指未必是 ACTION_DOWN 的那个⼿指)
注意第一个按下的手指和最后一个抬起的手指不一定是同一个
- ACTION_MOVE
有⼿指发⽣移动
- ACTION_POINTER_DOWN
额外⼿指按下(按下之前已经有别的⼿指触摸到 View)
- ACTION_POINTER_UP
有⼿指抬起,但不是最后⼀个(抬起之后,仍然还有别的⼿指在触摸着 View)
多点触控时,
MotionEvent
中会记录一系列事件
p(x,y,index,id)
其中 x,y 表示坐标,index 表示是第几个手指,id 表示手指的身份。
当有两个手指同时移动时,同一时刻会有两个事件,例如
p(100,200,0,2123123) p(300,400,1,2134234)
通过 getX() 永远只能获取 index 为 0 的那个手指的事件,而 index 是会变化的,当前面的 index 松开了,后面的 index 会前移,但是 id 值是不会变的。所以可以通过 id 追踪手指,通过 index 做遍历 MotionEvent.getActionIndex(index)
获取「⾮第⼀根按下⼿指」或「⾮最后⼀根抬起⼿指」的 index
触摸事件的结构
- 接⼒型
同⼀时刻只有⼀个 pointer 起作⽤,即最新的 pointer。
典型:ListView、RecyclerView。
实现⽅式:在 ACTION_POINTER_DOWN 和 ACTION_POINTER_UP 时记录下最新的 pointer,在之后的 ACTION_MOVE 事件中使⽤这个 pointer 来判断位置。
- 配合型 / 协作型
所有触摸到 View 的 pointer 共同起作⽤。
典型:ScaleGestureDetector,以及 GestureDetector 的 onScroll() ⽅法判断。
实现⽅式:在每个 DOWN、POINTER_DOWN、POINTER_UP、UP 事件中使⽤所有 pointer 的坐标来共同更新焦点坐标,并在 MOVE 事件中使⽤所有 pointer 的坐标来判断位置。
- 各⾃为战型
各个 pointer 做不同的事,互不影响。
典型:⽀持多画笔的画板应⽤。
实现⽅式:在每个 DOWN、POINTER_DOWN 事件中记录下每个 pointer 的 id,在 MOVE 事件中使⽤ id 对它们进⾏跟踪。
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/9225a8b3-4e80-4e95-b1a1-758c151d958b
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。