美文网首页
Android进阶——多点触控

Android进阶——多点触控

作者: yanlong107 | 来源:发表于2019-12-20 10:06 被阅读0次

    在学习多点触控之前,先复习下常用的单点触控。

    单点触控

    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

    相关文章

      网友评论

          本文标题:Android进阶——多点触控

          本文链接:https://www.haomeiwen.com/subject/uabtnctx.html