实现思路
在之前的博客获取手势信息(一)单个手指中掌握了如何获取单个手指的手势信息,但是这无法处理多个手指对View操作时的问题,例如三指下滑的操作要怎么做呢?经过看Google的文档文档链接,有下面几个方法可以实现。
返回值 | 方法名 | 描述 |
---|---|---|
int | getPointerCount() | The number of pointers of data contained in this event. |
- | - | 触点的个数,就是有几个手指同时接触屏幕 |
int | getPointerId(int pointerIndex) | Return the pointer identifier associated with a particular pointer data index in this event. |
- | - | 根据触点的Index获取Id |
int | getActionIndex() | For ACTION_POINTER_DOWN or ACTION_POINTER_UP as returned by getActionMasked(), this returns the associated pointer index. |
- | - | 返回上述两个方法的触点的Index |
float | getX(int pointerIndex) | Returns the X coordinate of this event for the given pointer index (use getPointerId(int) to find the pointer identifier for this index). |
- | - | 返回X的坐标根据触点的Index,需要用getPointerId(int)来找到这个Index的触点ID |
float | getY(int pointerIndex) | Returns the Y coordinate of this event for the given pointer index (use getPointerId(int) to find the pointer identifier for this index). |
- | - | 同上 |
有了这些方法就可以获取不同手指触点的信息了,但是我们还需要了解MotionEvent出发的时间点。我们用到的时间点有以下几个。
方法名 | 触发时间点说明 |
---|---|
ACTION_DOWN | 当第一个触点按下时触发,也就是在这之前屏幕上没有任何触点。通俗一点就是第一个手指按下去的时候触发 |
ACTION_POINTER_DOWN | 第一个触点之外的触点按下时触发,也就是一个触点按下时不会触发这个MotionEvent,需要第二个或第二个以上的触点按下时才会触发 |
ACTION_UP | 当最后一个触点从屏幕上离开时才会触发,比如两个手指在屏幕上,松开一个手指时是不会触发这个MotionEvent,需要再松开最后一个手指时才会触发 |
ACTION_POINTER_UP | 当不是最后一个手指离开屏幕时触发,也就是说这个方法和上面的ACTION_POINTER_DOWN方法,单指操作时一般不会触发,当然了滑动的时候屏幕有可能出现断触,有可能会触发 |
ACTION_MOVE | 当屏幕上的触点移动时触发,这个MotionEvent不管是第几个手指移动都会触发 |
了解了上述知识,就有了一个思路,我们可以在ACTION_POINTER_DOWN时用getPointerCount()获取当前屏幕上的触点个数我们记为fingerCount,然后为了防止移动时断触,记录下一开始的手指个数。然后在ACTION_MOVE时通过对比getPointerCount()和fingerCount来判断是不是我们需要的信息。如果相等我们就用getActionIndex()获取触点的Index再用getPointerId(int pointerIndex)获取点的ID。然后再使用这个ID用getX(int pointerIndex)去获取X、Y的值。然后我们用多个ArrayList把这些信息分别保存下来就可以了。
代码
话不多说,直接上代码。
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
fingerCount =motionEvent.getPointerCount();
if (view.getId() == R.id.sf) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_MOVE:
if (motionEvent.getPointerCount() == fingerCount) {
Log.d(TAG, "onTouch: fingerCount" + fingerCount);
switch (fingerCount) {
case 0:
break;
case 1:
Log.d(TAG, "onTouchEvent: get:" + 0 + ":" + motionEvent.getX(0) +
"," + motionEvent.getY(0));
break;
case 2:
Log.d(TAG, "onTouchEvent: get:" + 0 + ":" + motionEvent.getX(0) +
"," + motionEvent.getY(0));
Log.d(TAG, "onTouchEvent: get:" + 1 + ":" + motionEvent.getX(1) +
"," + motionEvent.getY(1));
break;
case 3:
Log.d(TAG, "onTouchEvent: get:" + 0 + ":" + motionEvent.getX(0) +
"," + motionEvent.getY(0));
Log.d(TAG, "onTouchEvent: get:" + 1 + ":" + motionEvent.getX(1) +
"," + motionEvent.getY(1));
Log.d(TAG, "onTouchEvent: get:" + 2 + ":" + motionEvent.getX(2) +
"," + motionEvent.getY(2));
break;
default:
break;
}
}
}
}
我们在onTouch()方法一开始时就设置了fingerCount去获取手指的数量,然后再方法里避免移动过程中手指数量改变导致的手指越界。 我们就用getActionIndex()获取触点的Index再用getPointerId(int pointerIndex)获取点的ID后发现手指的ID就是0,1,2等一系列数字,所以我们直接用坐标去获取X、Y。最后我们用Log打印一下就可以获取多个手指的坐标信息了。
总结
通过两篇文章我们已经简单获取了手指的所有信息。总结一下过程:
1.通过motionEvent.getPointerCount()方法获取手指数量。
2.通过坐标获取相应手指的X/Y
3.处理坐标信息。