支持多指操作的时候处理的触摸事件除了DOWN、MOVE、UP、CANCEL之外,还需要关注POINTER_DOWN和POINTER_UP事件
/**
* A non-primary pointer has gone down.
*/
public static final int ACTION_POINTER_DOWN = 5;
/**
* A non-primary pointer has gone up.
*/
public static final int ACTION_POINTER_UP = 6;
当***“非主要”***的手指落下或者抬起的时候,这两个Action会被触发。所谓的***非主要***指的是:
- 当有手指按下的时候,在它之前已经有手指按下了,而且还没有抬起,那么当前的手指就是非主要的手指
- 当有手指抬起的时候,如果还有别的手指没有抬起,那么这个抬起的手指就是非主要的
想要支持接受这两个ACTION,必须要使用getActionMasked方法。
官方处理多指滑动的例子:
ScrollView使用了一个叫做mActivePointerId的东西,用来记录当前活跃的指针,这也就是说,同一时间就算有多个手指在做滑动操作也只会响应mActivePointerId所对应的指针坐标。总体的流程总结如下:
- ACTION_DOWN:此时没有手指按下或者抬起——直接拿当前ID作为活跃ID
- ACTION_POINTER_DOWN:把新按下的手指当作活跃ID
- ACTION_MOVE:根据记录的活跃ID,获取到对应的触摸点坐标
- ACTION_POINTER_IP:如果刚好抬起的手指是当前活跃的手指,就指定另一根未抬起的手指当作活跃手指(Index是可以复用的,如果当前活跃手指Index为0,那就取Index为1的手指为活跃手指备选,否则取Index为0的手指为活跃手指备选)
- ACTION_UP:最后一根手指抬起,重置活跃ID为无效
- ACTION_CANCEL:收到取消动作,处理方式和ACTION_UP一样