多点触控在 Android 上的实际效果如何?
How does multi-touch really work on Android?
在我的用例中有 2 个图标(在 GL 场景中),我想并行且独立地处理它们的按下、保持和释放状态(用 2 个手指)。
为此,我尝试了许多代码变体。目前这是性能最好但仍然很糟糕的代码:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (v != this) return false;
boolean down = false;
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_POINTER_DOWN:
down = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
down = false;
break;
}
boolean handled = e.getPointerCount() > 0;
for(int i = 0; i < e.getPointerCount(); i++) {
e.getPointerCoords(i, coords);
int pointer = e.getPointerId(i);
if (down) {
scene.sizes.pixelToCm(vec, coords.x, coords.y);
touchMap.set(pointer, vec.getX(), vec.getY());
} else {
touchMap.clear(pointer);
}
}
return true;
}
在这种情况下,当我按住图标A时,就可以了。比起我仍然按住图标 A 并按下图标 B,也可以,两个图标都被按下了。但是当我释放图标 B 时,图标 A 也会暂时释放。
我猜 onTouch() 事件处理程序得到一个 UP 事件,但它的指针列表(e.getPointerCount(),e.getPointerCoords())还包括 DOWN 指针。
谁能帮我解决这个问题?
这段代码似乎符合我的预期:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (v != this) return false;
for(int i = 0; i < 8; i++)
touchMap.clear(i);
if (e.getActionMasked() == MotionEvent.ACTION_UP) {
return true;
}
for(int i = 0; i < e.getPointerCount(); i++) {
e.getPointerCoords(i, coords);
int pointer = e.getPointerId(i);
scene.sizes.pixelToCm(vec, coords.x, coords.y);
touchMap.set(pointer, vec.getX(), vec.getY());
}
return true;
}
在我的用例中有 2 个图标(在 GL 场景中),我想并行且独立地处理它们的按下、保持和释放状态(用 2 个手指)。
为此,我尝试了许多代码变体。目前这是性能最好但仍然很糟糕的代码:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (v != this) return false;
boolean down = false;
switch (e.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_POINTER_DOWN:
down = true;
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
case MotionEvent.ACTION_OUTSIDE:
case MotionEvent.ACTION_CANCEL:
down = false;
break;
}
boolean handled = e.getPointerCount() > 0;
for(int i = 0; i < e.getPointerCount(); i++) {
e.getPointerCoords(i, coords);
int pointer = e.getPointerId(i);
if (down) {
scene.sizes.pixelToCm(vec, coords.x, coords.y);
touchMap.set(pointer, vec.getX(), vec.getY());
} else {
touchMap.clear(pointer);
}
}
return true;
}
在这种情况下,当我按住图标A时,就可以了。比起我仍然按住图标 A 并按下图标 B,也可以,两个图标都被按下了。但是当我释放图标 B 时,图标 A 也会暂时释放。
我猜 onTouch() 事件处理程序得到一个 UP 事件,但它的指针列表(e.getPointerCount(),e.getPointerCoords())还包括 DOWN 指针。
谁能帮我解决这个问题?
这段代码似乎符合我的预期:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (v != this) return false;
for(int i = 0; i < 8; i++)
touchMap.clear(i);
if (e.getActionMasked() == MotionEvent.ACTION_UP) {
return true;
}
for(int i = 0; i < e.getPointerCount(); i++) {
e.getPointerCoords(i, coords);
int pointer = e.getPointerId(i);
scene.sizes.pixelToCm(vec, coords.x, coords.y);
touchMap.set(pointer, vec.getX(), vec.getY());
}
return true;
}