Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在动作移动过程中用另一个手指检测触摸事件_Android_Event Handling - Fatal编程技术网

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中被弃用。使用操作指针索引掩码检索与操作指针向下关联的数据索引。我已经尝试过这种方法,但没有为您的答案工作,但我已经用我自己的答案中提供的代码解决了这个问题