我有一个SurfaceView,我正在画一个圆圈。我知道圆的位置和半径。
我需要知道用户是否按下了圆圈。用户可能正用一根或两根手指敲击屏幕。如果任何手指在圆圈区域上方,则必须按下它。
当用户从屏幕上抬起手指,并且手指不再在圆圈上方时,圆圈必须停止按下。
当用户在屏幕上只有一根手指时,我没有遇到任何问题,但是当他用两根手指时我无法解决问题。
我遇到的问题是当我收到ACTION_UP或ACTION_POINTER_UP动作时,我不知道哪个指针不再在屏幕上,所以我不必查看它们的坐标是否在圆圈上。
我做了几次尝试没有成功,最后一次是:
protected boolean checkPressed(MotionEvent event) {
ColourTouchWorld w = (ColourTouchWorld)gameWorld;
int actionMasked = event.getActionMasked();
for (int i = 0; i < event.getPointerCount(); i++) {
if (i == 0 && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) {
// the pointer with index 0 is no longer on screen,
// so the circle is not pressed by this pointer, even if
// it's coordinates are over the area of the circle
continue;
}
if (isPointInCicle(event.getX(i)), event.getY(i))) {
return true;
}
}
return false;
}
有什么想法吗?谢谢。
答案 0 :(得分:2)
在问题中写的方法中,我假设收到的动作是指向索引为0的指针。我错了,但我需要使用ACTION_POINTER_INDEX_MASK
该方法的正确实施是:
protected boolean checkPressed(MotionEvent event) {
ColourTouchWorld w = (ColourTouchWorld)gameWorld;
int actionMasked = event.getActionMasked();
int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT);
for (int i = 0; i < event.getPointerCount(); i++) {
if (i == pointerIndex && (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_POINTER_UP)) {
// the pointer with index 0 is no longer on screen,
// so the circle is not pressed by this pointer, even if
// it's coordinates are over the area of the circle
continue;
}
if (isPointInCicle(event.getX(i)), event.getY(i))) {
return true;
}
}
return false;
}
答案 1 :(得分:1)
您需要使用ACTION_POINTER_INDEX_MASK常量。我从来没有实现过这个,所以我不知道代码的样子。但我认为你需要使用它。