Android 获取手势信息(二)多个手指

实现思路

在之前的博客获取手势信息(一)单个手指中掌握了如何获取单个手指的手势信息,但是这无法处理多个手指对View操作时的问题,例如三指下滑的操作要怎么做呢?经过看Google的文档文档链接,有下面几个方法可以实现。

返回值方法名描述
intgetPointerCount()The number of pointers of data contained in this event.
--触点的个数,就是有几个手指同时接触屏幕
intgetPointerId(int pointerIndex)Return the pointer identifier associated with a particular pointer data index in this event.
--根据触点的Index获取Id
intgetActionIndex()For ACTION_POINTER_DOWN or ACTION_POINTER_UP as returned by getActionMasked(), this returns the associated pointer index.
--返回上述两个方法的触点的Index
floatgetX(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
floatgetY(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.处理坐标信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值