在学习多点触控之前,先复习下常用的单点触控。
单点触控
Android 触摸事件处理的核心方法为onTouchEvent(MotionEvent event)
onTouchEvent(MotionEvent event)
方法中可以接收到完整触摸事件流。
下面是一个完整事件流的例子:
ACTION_DOWN
---> ACTION_MOVE
---> ....... ---> ACTION_MOVE
---> ACTION_UP
(或者ACTION_CANCEL
)
1. 获取事件类型
通过 event.action
来获取事件类型
其中 ACTION_MOVE
根据手指移动的不同,触发的次数也会不同。
ACTION_DOWN
: 手指按下事件, 一次事件流中只触发1次,是事件起始的标志
ACTION_MOVE
: 手指移动事件
ACTION_UP
: 手指抬起
ACTION_CANCEL
: 事件取消
tips:
如果需要处理事件流的话,ACTION_DOWN
时必须返回 true
,返回 false
会导致后续的事件流不会再接收到。
2. 获取事件相关数据
收到事件到达后,就需要获取相关的数据,来进行我们的业务逻辑。
event.getX()
和 event.getY()
基本是最常用的数据了。 通过这个两个函数可以获取当前手指在屏幕中的位置。
ACTION_MOVE
时不断获取最新的手指位置,就能够判断手指移动的方向和距离,从而更新对应view的位置。
有了单点触控的基础,下面介绍多点触控会简单很多, 因为基本原理是相同的。
多点触控
事件流示例 :
ACTION_DOWN
---> ACTION_MOVE
---> ACTION_POINTER_DOWN
---> ACTION_MOVE
---> ACTION_POINTER_UP
....... ---> ACTION_MOVE
---> ACTION_UP
(或者ACTION_CANCEL
)
1.获取事件类型
通过 event.action
来获取事件类型(单点中已经介绍的这里就不再介绍了)
ACTION_POINTER_DOWN
: 额外⼿手指按下(按下之前已经有别的⼿手指触摸到 View)
ACTION_POINTER_UP
: 有⼿手指抬起,但不不是最后⼀一个(抬起之后,仍然还有别的⼿手指在触 摸着 View)
2.获取多点相关数据
event.actionIndex
: 获取触摸手指的下标
event.getPointerId
: 触摸手指的id。
每个触摸到view的手指都会包含 index 和 id数据。 index 和 id 变化规则如下:
1,index 从0 开始分配
2,index 在一个事件流中是会变化的。 (例如,按下手指1 这个手指index=0, 继续按下手指2,手指的index = 1,继续按下手指3,手指3的index=2. 这时候如果抬起手指2,那手指3的index= 1)
3, PointerId 在一个事件流中,不会变化,可以用来判断跟踪按下的手指。
常见用法(手指接力滑动类):
1,获取操作手指的下标: ACTION_DOWN
/ACTION_POINTER_DOWN
时通过 event.actionIndex
获取变化手指的下标 index (pointerIndex)
2,获取手指的id来跟踪手指: event.getPointerId(pointerIndex)
3,业务逻辑处理: ACTION_MOVE
时通过 event.findPointerIndex()
获取手指的下标index ,这样就能获取到手指的点位置。 event.getX(index)
和 event.getY(index)
4, 手指抬起:手指抬起时需要判断是否是正在操作的手指,如果是的话一般需要特殊处理。(因为操作的手指抬起后,跟踪记录的手指会有变化,这里需要重新找到需要跟踪的手指)
// 获取当前操作的手指下标
actionIndex = event.getActionIndex();
// 获取当前操作的手指id
int pointerId = event.getPointerId(actionIndex);
if (pointerId == trackingPointerId) {
int newIndex;
if (actionIndex == event.getPointerCount() - 1) {
newIndex = event.getPointerCount() - 2;
} else {
newIndex = event.getPointerCount() - 1;
}
trackingPointerId = event.getPointerId(newIndex);
downX = event.getX(actionIndex);
downY = event.getY(actionIndex);
originalOffsetX = offsetX;
originalOffsetY = offsetY;
}
上面介绍了多点触控中最基础的用法,有了这些基础后就可以更好的理解系统一些手势的原理,之后有需要的时候也能更好实现自定义的需求。
END
网友评论