我目前正在开发我的第一个多点触控Android应用程序,而且我在使用onTouchEvent()时遇到了一些困难。我已经使用了在线教程中的一些代码,它似乎为我在屏幕上的每次触摸提供了正确的指针ID信息,但ACTION_POINTER_DOWN事件的事件坐标似乎总是与初始触摸的坐标相同。我的代码如下:
private int getIndex(MotionEvent event) {
int idx = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
return idx;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch(action) {
case MotionEvent.ACTION_DOWN : {
int id = event.getPointerId(0);
Log.d("CV", "Point number " +id+ " is down at X value " +event.getX());
callbackListener.onTouchDown(event, id);
break;
}
case MotionEvent.ACTION_MOVE : {
int touchCounter = event.getPointerCount();
for (int t = 0; t < touchCounter; t++) {
int id = event.getPointerId(t);
callbackListener.onMove(event, id);
}
break;
}
case MotionEvent.ACTION_POINTER_DOWN : {
int id = event.getPointerId(getIndex(event));
Log.d("CV", "Point number " +id+ " is down at X value " +event.getX());
callbackListener.onTouchDown(event, id);
break;
}
case MotionEvent.ACTION_POINTER_UP : {
int id = event.getPointerId(getIndex(event));
//Log.d("CV", "Other point up ["+id+"]");
callbackListener.onTouchUp(event, id);
break;
}
case MotionEvent.ACTION_UP : {
int id = event.getPointerId(0);
//Log.d("CV", "Pointer up ["+id+"]");
callbackListener.onTouchUp(event, id);
break;
}
}
return true;
}
在显示我的指针X位置的日志中,您可以看到当我向屏幕添加额外触摸(指针编号1)时,X坐标与第一次触摸(指针编号0)相同。 ..
11-25 12:34:02.911: D/CV(25231): Point number 0 is down at X value 260.60608
11-25 12:34:05.281: D/CV(25231): Point number 0 is down at X value 477.57578
11-25 12:34:06.261: D/CV(25231): Point number 0 is down at X value 581.8182
11-25 12:34:11.891: D/CV(25231): Point number 0 is down at X value 267.87878
11-25 12:34:13.321: D/CV(25231): Point number 1 is down at X value 267.87878
这令我感到沮丧,因为我几乎从在线教程中复制并粘贴了整个内容,我无法理解为什么它无法正常工作!另外,正如您可以想象的那样,ACTION_MOVE也无法正常工作......
非常感谢任何帮助,谢谢
答案 0 :(得分:1)
这是因为event.getX()
返回first
指针索引的值。
您应该使用getX(int pointerIndex)
,如下所示:
Log.d("CV", "Point number " +id+ " is down at X value " +event.getX(getIndex(event)));