前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android进阶——多点触控

Android进阶——多点触控

作者头像
艳龙
发布2021-12-16 17:30:34
1K0
发布2021-12-16 17:30:34
举报
文章被收录于专栏:yanlongli_艳龙yanlongli_艳龙

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

单点触控

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 变化规则如下:

代码语言:javascript
复制
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, 手指抬起:手指抬起时需要判断是否是正在操作的手指,如果是的话一般需要特殊处理。(因为操作的手指抬起后,跟踪记录的手指会有变化,这里需要重新找到需要跟踪的手指)

代码语言:javascript
复制
// 获取当前操作的手指下标
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 单点触控
    • 1. 获取事件类型
      • 2. 获取事件相关数据
      • 多点触控
        • 1.获取事件类型
          • 2.获取多点相关数据
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档