我知道该主题还有一些其他主题,但毫无疑问可以将问题简化为几行代码:
@Override
public boolean onTouchEvent(MotionEvent event) {
int count = event.getPointerCount();
for (int i = 0; i < count; ++i) {
int id = event.getPointerId(i);
event.getX(id); // Exception here
}
}
代码只获取指针数,询问指针id并使用它来读取指针的x值。
当我使用多个手指时,代码抛出“IllegalArgumentException:pointerIndex超出范围”。
抛出异常并执行所有可能的操作(“ACTION_DOWN”,“ACTION_POINTER_DOWN”,“ACTION_UP”,“ACTION_POINTER_UP”和“ACTION_MOVE”)
示例:
我放下手指一,然后放下手指两个,然后放上手指一个=&gt;手指的每一个动作现在都失败了。
完成onTouchEvent测试:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = (event.getActionMasked() & MotionEvent.ACTION_MASK);
int count = event.getPointerCount();
String actionStr = null;
switch (action) {
case MotionEvent.ACTION_DOWN:
actionStr = "down";
break;
case MotionEvent.ACTION_UP:
actionStr = "up";
break;
case MotionEvent.ACTION_MOVE:
actionStr = "move";
break;
case MotionEvent.ACTION_POINTER_UP:
actionStr = "pointer up";
break;
case MotionEvent.ACTION_POINTER_DOWN:
actionStr = "pointer down";
break;
}
try {
for (int i = 0; i < count; ++i) {
int id = event.getPointerId(i);
event.getX(id);
//event.getY(id);
}
} catch (Exception e) {
Log.d("_FAIL_", actionStr);
}
return true;
}
答案 0 :(得分:1)
你应该这样做:
event.getX(event.findPointerIndex(id));
修改强>
未定义单个指针在运动事件中出现的顺序。因此,指针的索引可以从一个事件改变到下一个事件,但只要指针保持活动状态,指针的指针ID就保证保持不变。使用getPointerId()方法获取指针的ID,以跟踪手势中所有后续运动事件的指针。然后,对于连续的运动事件,使用findPointerIndex()方法获取该运动事件中给定指针ID的指针索引。
我希望它有所帮助。