在一个空的acyivity上重写onTouchEvent方法做的两点触控(因为tp不支持三点的原因,只能做两点的)实验
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
int index = event.getActionIndex();
int id = event.getPointerId(index);
//float x = event.getX(event.findPointerIndex(id));
Log.v("xml_log_empty","ACTION_DOWN index=" + index +" ;id="+id);
break;
case MotionEvent.ACTION_POINTER_DOWN:
int index2 = event.getActionIndex();
int id2 = event.getPointerId(index2);
Log.v("xml_log_empty","ACTION_POINTER_DOWN index=" + index2 +" ;id="+id2);
break;
case MotionEvent.ACTION_MOVE:
int index3 = event.getActionIndex();
int id3 = event.getPointerId(index3);
Log.v("xml_log_empty","ACTION_MOVE index=" + index3+" ;id="+id3);
break;
case MotionEvent.ACTION_POINTER_UP:
int index4 = event.getActionIndex();
int id4 = event.getPointerId(index4);
Log.v("xml_log_empty","ACTION_POINTER_UP index=" + index4 +" ;id="+id4);
break;
case MotionEvent.ACTION_UP:
int index5 = event.getActionIndex();
int id5 = event.getPointerId(index5);
Log.v("xml_log_empty","ACTION_UP index=" + index5 +" ;id="+id5);
break;
}
return false;
}
①:在第一个点(后面简称点1)触摸到屏幕的时候会触发ACTION_DOWN,打印结果【ACTION_DOWN index=0 ;id=0】;
②:点1移动触发ACTION_MOVE,打印结果【ACTION_DOWN index=0 ;id=0】;
③:第二个点(后面简称点2)触摸到屏幕会触发ACTION_POINTER_DOWN,打印结果【ACTION_POINTER_DOWN index=1 ;id=1】;
④:两点一起移动触发ACTION_MOVE,打印结果【ACTION_MOVE index=0 ;id=0】,这里只有点1的信息被打印出来了,如果想要操作点2,那么在ACTION_POINTER_DOWN的时候就应该把点2的id记下来(为什么不记index?);
⑤:抬起点1触发ACTION_POINTER_UP,打印结果【ACTION_POINTER_UP index=0 ;id=0】,打印出来的是被抬起的点1的信息;
⑥:继续移动点2,触发ACTION_MOVE,打印结果【ACTION_MOVE index=0 ;id=1】,发现点2因为点1的离开,index发生了变化,但是id仍然没变,这就解答了步骤④的问题,因为index会变化,所以不去记它,通过id去定位点才是准确;
⑦:加入点3,触发ACTION_POINTER_DOWN,打印结果【ACTION_POINTER_DOWN index=0 ;id=0】,发现原本已经用过的0,又被附在了新的点上,而且index也插到了前面,可以理解为原来的点回来了;
⑧:两点一起移动触发ACTION_MOVE,打印结果【ACTION_MOVE index=0 ;id=0】,可以得出结论,move的时候得到的点是index为0时的点;
⑨:点2离开,触发ACTION_POINTER_UP,打印结果【ACTION_POINTER_UP index=1 ;id=1】;
⑩:点1离开,此时所有点都离开了,才会触发ACTION_UP,打印结果【ACTION_UP index=0 ;id=0】,当然打印出来的信息,也是剩下的那个点的信息。
但是通过event获取每一个点的信息(x,y,压力等),所调用的方法所需要的参数却是index,可以index却是有可能会变化的,那就需要通过id去找到对应的index了,findPointerIndex(id)方法就是通过id得到对应的index的