美文网首页
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进阶——多点触控

    在学习多点触控之前,先复习下常用的单点触控。 单点触控 Android 触摸事件处理的核心方法为onTouchEv...

  • Android多点触控时出现pointerIndex out o

    Android多点触控时出现pointerIndex out of range 的错误分析 关于多点触控时出现po...

  • Android 禁用多点触控

    Android 禁用多点触控 两种方式: 1、禁用全局多点触控: 在application引用的Theme中添加以...

  • Android禁止多点触控

    在application或activity引用的Theme加入以下属性: 比如我的style.xml文件:

  • Android多点触控基础

    处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上。 再继续往下以前需要补充一些名词(弄清楚这些对理解下...

  • Android MultiTouch 多点触控

    演示效果 demo实现第一、二个触控点的坐标记录及绘制展示e47k6-a128q.gif 多点触控操作判断的值 关键代码

  • Android识别多点触控

    正常开发中,单点触控场景遇到的比较多,比如识别 ACTION_DOWN、ACTION_UP、ACTION_MOVE...

  • Android 禁用多点触控

    两种方式: 1、禁用全局多点触控: 在application引用的Theme中添加以下代码: false ...

  • Android多点触控最佳实践

      好久没有更新自己的简书博客了,说来真是惭愧,感觉自己太点懒了。话说其实坚持写博客还是很有用的,可以梳理自己的知...

  • Android:禁用全局多点触控

    在application引用的Theme中下面两个属性设置为false android:windowEnableS...

网友评论

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

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