Android多点触控事件问题…拖动时没有新的触控事件?
所以我想做的是一个小空间游戏,你使用touch
和drag
控制船上的图形屏幕操纵杆 。 我已经让这个工作得很好。 一旦我开始尝试添加触摸屏幕顶部以发射武器的能力,就会出现问题。 出于某种原因,如果您当前正在拖动操纵杆,它似乎忽略了其他触摸输入并且没有做任何事情(但是一旦我停止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_DOWN
和MotionEvent.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; } }
有关更多说明,请参见此处和此处 。