前言
自定义组件 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 |
可见我们无法区分交替按下的两个手指。