Android多指触控

前言

自定义组件 https://www.psvmc.cn/article/2017-12-22-android-custom-view.html

事件和方法

多点触控时必须使用getActionMasked()来获取事件类型

多点触控相关事件

事件 简介
ACTION_DOWN 第一个手指初次接触到屏幕时触发
ACTION_POINTER_DOWN 有非主要的手指按下(即按下之前已经有手指在屏幕上)
ACTION_UP 最后一个手指离开屏幕时触发
ACTION_POINTER_UP 有非主要的手指抬起(即抬起之后仍然有手指在屏幕上)
ACTION_MOVE 手指在屏幕上滑动时触发,会多次触发。

多点触控相关的方法:

方法 简介
getActionMasked() 与 getAction() 类似,多点触控需要使用这个方法获取事件类型
getActionIndex() 获取该事件是哪个指针(手指)产生的
getPointerId(int pointerIndex) 获取一个指针(手指)的唯一标识符ID,在手指按下和抬起之间ID始终不变
getX(int pointerIndex) 获取某一个指针(手指)的X坐标
getY(int pointerIndex) 获取某一个指针(手指)的Y坐标
findPointerIndex(int pointerId) 通过PointerId获取到当前状态下PointIndex,之后通过PointIndex获取其他内容
getPointerCount() 获取在屏幕上手指的个数

Pointer

Pointer:
MotionEvent中引入了Pointer的概念,一个pointer就代表一个触摸点,每个pointer都有自己的事件类型,也有自己的横轴坐标值。一个MotionEvent对象中可能会存储多个pointer的相关信息,每个pointer都会有一个自己的id和index。pointer的id在整个事件流中是不会发生变化的,但是index会发生变化
PointerId:
每根手指从按下、移动到离开屏幕,每个手指都会拥有一个固定PointerId.PointerId的值,一般用它来区分是哪根手指
PointerIndex:
每根手指从按下、移动到离开屏幕,每根手指在每一个事件的Index可能是不固定的,因为受到其它手指的影响
PointerId和PointerIndex的变化规律
关于变化规律:

事件 PointerId PointerIndex
依次按下三根手指 三根手指的id依次为0、1、2 三根手指的index依次为0、1、2
抬起第二根手指 第一根手指的id为0,第三根手指的id为2 第一根手指的index为0,第三根手指的index变为1
抬起第一根手指 第三根手指的id为2 第三根手指的index变为0

可见同一根手指的id是不会变化的,而index是会变化的,但总是以0、1或者0、1、2这样的形式出现,而不可能出现0、2这样间隔了一个的或者1、2这样的没有0索引在内的形式

事件 PointerId PointerIndex
依次按下两根手指 两根手指的id依次为0、1 两根手指的index依次为0、1
抬起第二根手指 第一根手指的id为0 第一根手指的index为0
按下第三根手指 第三根手指的id为1 第三根手指的index变为1

可见我们无法区分交替按下的两个手指。