如何在ACTION_MOVE处理过程中用另一根手指检测TOUCH事件

时间:2015-05-18 16:05:49

标签: android event-handling

我正在开发一款游戏,我需要能够检测到一根手指正在执行移动,而另一根手指可以触及另一部分屏幕。

使用以下代码,我能够检测到ACTION_MOVE(在屏幕的某个区域)和ACTION_DOWN

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;
}

问题在于我无法同时移动和开火(我需要停止移动以便开火和反之)

我知道Android can handle multi-touch events但是没有想到如何使用它来处理这些事件并且同时让玩家可以同时移动和射击

我也尝试使用getActionMasked而没有任何运气

3 个答案:

答案 0 :(得分:2)

阅读此问题后Android MotionEvent.getActionIndex() and MultiTouch

这就是我解决问题的方法

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;
}

答案 1 :(得分:0)

MotionEvent包含您需要的所有触摸信息。您可以通过执行event.getPointersCount()获取触摸次数,并尝试检查MotionEvent.ACTION_POINTER_2_DOWN而不是MotionEvent.ACTION_DOWN。要获取每次触摸的坐标,您可以使用event.getX(0)event.getX(1),同样适用于y。如果您的案例MotionEvent.ACTION_MOVE有2次触摸,您将在动议活动中收到所有这些信息。

答案 2 :(得分:0)

尝试以下代码。 当多个指针触摸屏幕时,系统会生成动作事件。我们可以使用指针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");
    }
}