事故现场
最近在对公司项目中的控件进行优化改造,其中一个是能够上拉和下拉的弹性ScrollView。
发现没有,当使用一个手指的时候感觉还不错。但是当我想用两个手指交替不断下拉想要把视图内容往下“扒”的时候就办不到了,因为他在onTouchEvent()方法里只是最简单的实现了下拉的逻辑而没有涉及到多指触控,而我想要的效果是像QQ空间或者微信朋友圈那样的。
预备知识
为了将控件改造成能够支持多点触控的,首先我们需要了解Android中关于多点触控的基础知识。这里我推荐先阅读GcsSloop的两篇文章
安卓自定义View进阶-MotionEvent详解
安卓自定义View进阶-多点触控详解
我现在假设你已经看了上面的那两篇文章,下面我来划重点:
1.多点触控时必须使用getActionMasked()来获取事件类型
2.Pointer:
MotionEvent中引入了Pointer的概念,一个pointer就代表一个触摸点,每个pointer都有自己的事件类型,也有自己的横轴坐标值。一个MotionEvent对象中可能会存储多个pointer的相关信息,每个pointer都会有一个自己的id和index。pointer的id在整个事件流中是不会发生变化的,但是index会发生变化
3.PointerId:
每根手指从按下、移动到离开屏幕,每个手指都会拥有一个固定PointerId.PointerId的值,一般用它来区分是哪根手指
4.PointerIndex:
每根手指从按下、移动到离开屏幕,每根手指在每一个事件的Index可能是不固定的,因为受到其它手指的影响
5.PointerId和PointerIndex的变化规律
关于变化规律这里,可以看GcsSloop的第二篇文章,这里我不再赘述,只举一个实际的例子:
事件 | 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索引在内的形式
6.多点触控相关事件
事件 | 简介 |
---|---|
ACTION_DOWN | 第一个手指初次接触到屏幕时触发 |
ACTION_MOVE | 手指在屏幕上滑动时触发,会多次触发。 |
ACTION_UP | 最后一个手指离开屏幕时触发 |
ACTION_POINTER_DOWN | 有非主要的手指按下(即按下之前已经有手指在屏幕上) |
ACTION_POINTER_UP | 有非主要的手指抬起(即抬起之后仍然有手指在屏幕上) |
7.多点触控相关的方法:
方法 | 简介 |
---|---|
getActionMasked() | 与 getAction() 类似,多点触控需要使用这个方法获取事件类型 |
getActionIndex() |