Android 如何在动作移动过程中用另一个手指检测触摸事件
我正在开发一个游戏,我需要能够检测到一个手指正在执行动作,而另一个手指可以触摸屏幕的另一部分 通过下面的代码,我能够检测到动作移动(在屏幕的特定区域)和动作向下Android 如何在动作移动过程中用另一个手指检测触摸事件,android,event-handling,Android,Event Handling,我正在开发一个游戏,我需要能够检测到一个手指正在执行动作,而另一个手指可以触摸屏幕的另一部分 通过下面的代码,我能够检测到动作移动(在屏幕的特定区域)和动作向下 public boolean onTouch(View v, MotionEvent event) { final int dest_x = (int) event.getX(); final int dest_y = (int) event.getY(); onTrackPad = dbSettings.TR
public boolean onTouch(View v, MotionEvent event) {
final int dest_x = (int) event.getX();
final int dest_y = (int) event.getY();
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
问题是我不能同时移动和开火(我需要停止移动才能开火和开火)
我知道,但还没有弄清楚如何利用它来处理这些事件,同时让玩家可以移动和开火
我还尝试在没有任何运气的情况下使用
getActionMasked
MotionEvent提供了您所需的所有触摸信息。您可以通过执行event.getPointersCount()
来获得触摸次数,并尝试检查MotionEvent.ACTION\u POINTER\u 2\u DOWN
而不是MotionEvent.ACTION\u DOWN
。要获取每次触摸的坐标,可以使用event.getX(0)
和event.getX(1)
,对于y
也是如此。如果您有两次触碰MotionEvent.ACTION\u MOVE
,您将在运动事件中收到所有这些信息。阅读此问题后
这就是我解决问题的方法
public boolean onTouch(View v, MotionEvent event) {
int dest_x ;
int dest_y ;
p = event.getActionIndex() ;
dest_x = (int) event.getX(p);
dest_y = (int) event.getY(p);
onTrackPad = dbSettings.TRACK_PAD.contains(dest_x, dest_y);
action = event.getActionMasked() ;
switch (action) {
case MotionEvent.ACTION_MOVE:
if (onTrackPad)
{
//move character
}
break;
case MotionEvent.ACTION_DOWN:
// Fire bullets
break;
}
//The event was consumed
return true;
}
试试下面的代码。
当多个指针在屏幕上触摸时,系统会生成动作事件。我们可以使用指针id跟踪运动事件中的单个指针。指针id在触摸事件中保持不变,还允许在整个手势中跟踪单个指针
@Override
public boolean onTouch(View v, MotionEvent event) {
int index = event.getActionIndex();
int pointerID = event.getPointerId(index);
int action = event.getActionMasked();
if(event.getPointerCount() > 1)
{
Log.i("TouchType ", "Multi Touch");
for(int i = 0; i < event.getPointerCount(); i++)
{
performAction(action);
}
}else
{
Log.i("TouchType ", "Single Touch");
performAction(action);
}
return true;
}
public void performAction(int action){
switch(action)
{
case MotionEvent.ACTION_DOWN :
Log.i("OnTouch ", "Pressed");
// Fire bullets
break;
case MotionEvent.ACTION_MOVE :
Log.i("OnTiouch", "move");
//move character
break;
case MotionEvent.ACTION_UP :
Log.i("OnTiouch", "Up");
break;
default:
Log.i("OnTiouch", "None");
}
}
@覆盖
公共布尔onTouch(视图v,运动事件){
int index=event.getActionIndex();
int pointerID=event.getPointerId(索引);
int action=event.getActionMasked();
if(event.getPointerCount()>1)
{
Log.i(“触摸类型”、“多点触摸”);
for(int i=0;i
您的MotionEvent不是存储了所有multytouch信息吗@eduyayo您刚刚包含了与我提供的链接相同的链接,您能否向我提供一个更详细的答案(不是评论)谢谢您需要在单独的线程中执行移动和触发,否则它将中断UI线程(如果您还没有执行)。@Manu这将如何完成?我目前没有使用线程来处理事件,我的视图也是touch listener.ACTION\u POINTER\u 2\u DOWN在API级别8中被弃用。使用操作指针索引掩码检索与操作指针向下关联的数据索引。我已经尝试过这种方法,但没有为您的答案工作,但我已经用我自己的答案中提供的代码解决了这个问题