Android多点触控事件问题…拖动时没有新的触控事件?

所以我想做的是一个小空间游戏,你使用touchdrag控制船上的图形屏幕操纵杆 。 我已经让这个工作得很好。 一旦我开始尝试添加触摸屏幕顶部以发射武器的能力,就会出现问题。 出于某种原因,如果您当前正在拖动操纵杆,它似乎忽略了其他触摸输入并且没有做任何事情(但是一旦我停止joystick就可以正常工作)。 这是我第一次使用java和Android所以它可能是愚蠢的东西,但静止了几天。 无论如何,这里是我的代码。

以下是我的

 public class Panel extends SurfaceView implements SurfaceHolder.Callback { @Override public boolean onTouchEvent(MotionEvent event) { fingers= event.getPointerCount(); //Returns 1 or 2 properly if 2 fingers on screen playership.onTouchEvent(event); //Pass the event along to the spaceship object return true; //return super.onTouchEvent(event); //no idea what this does, but it seems to disable the drag event } 

以下是playership.onTouchEvent(event); function

 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if(event.getY()<(Panel.mHeight-150)) { Laser1.reset(mX,mY,(int)event.getX(),(int)event.getY()); } break; } joy1.onTouchEvent(event); return true; } 

以下是joy1.onTouchEvent(事件);

 public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); //Offset between mouse(x,y) and center double offx=oX-event.getX(); double offy=oY-event.getY(); double d=Math.sqrt((offx*offx)+(offy*offy)); switch (eventaction ) { case MotionEvent.ACTION_DOWN: if(ddragrange) { dX=(int) (offx*dragrange); dY=(int) (offy*dragrange); } else { dX=(int) (offx*d); dY=(int) (offy*d); } reset = false; } break; case MotionEvent.ACTION_UP: if(Dragging) { Dragging=false; } break; } return true; } 

所以是的,问题是如果操纵杆位于一个案例MotionEvent.ACTION_MOVE的中间,它似乎阻止任何其他触摸事件正确注册。

你需要处理检测另一个手指。 更具体的处理

MotionEvent.ACTION_POINTER_DOWNMotionEvent.ACTION_POINTER_UP

否则你会忽略其他手指。 以下是我的一个项目中的一些代码,它们正是您正在寻找的内容:

 public void onTouchEvent(MotionEvent event) { int ptrId = -1; int action = event.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: down(event.getPointerId(0), (int)event.getX(), (int)event.getY()); break; case MotionEvent.ACTION_UP: up(event.getPointerId(0)); break; case MotionEvent.ACTION_POINTER_DOWN: ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; int ptrIdx = event.findPointerIndex(ptrId); down(ptrId, (int)event.getX(ptrIdx), (int)event.getY(ptrIdx)); break; case MotionEvent.ACTION_POINTER_UP: ptrId = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; up(ptrId); break; case MotionEvent.ACTION_MOVE: for(int i = 0; i < event.getPointerCount(); ++i) if(event.getPointerId(i) == inputPad.id()) { inputPad.position(event.getX(inputPad.id())); player.velocity(inputPad.delta()); player.stand(); if(enemy != null) { Fighter.collide(player, enemy); enemy.update(); } player.update(); break; } break; } } 

有关更多说明,请参见此处和此处 。