java - 如何使多点触控在Android中工作?

原文 标签 java android multi-touch touch-event

我在android中创建Pong游戏,多点触控出现问题

为了移动两个播放器,我使用了onTouchEvent方法,并且两个播放器可以同时移动。有一个问题:如果屏幕上的最后一根手指不是第一根,那么我会遇到一个异常,因为剩余手指的pointerId等于pointerCount,并且游戏退出。而且我必须使用onTouchEvent方法来获得屏幕上所有手指的x和y坐标。

 @SuppressLint("ClickableViewAccessibility")
    public boolean onTouchEvent(MotionEvent event) {
        final int actionPerformed = event.getAction();
        switch(actionPerformed) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                int pointerCount = event.getPointerCount();
                for(int i=0; i<pointerCount; i++) {
                    int x = (int) event.getX(event.getPointerId(i));
                    int y = (int) event.getY(event.getPointerId(i));
                    if(y<this.height/2-joueur1.getRayon()-1) { joueur1.setX(x); joueur1.setY(y); }
                    else if(y>this.height/2+joueur2.getRayon()+1){ joueur2.setX(x); joueur2.setY(y); }
                }
                break;
            case MotionEvent.ACTION_UP:
        }
        return true;
    }
//This is the message shown when I'm releasing a finger which is not the last one down

E/MotionEvent-JNI: An exception occurred: pointerCount 1, pointerIndex 1.
E/InputEventReceiver: Exception dispatching input event.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pong, PID: 29258
    java.lang.IllegalArgumentException: pointerIndex out of range
        at android.view.MotionEvent.nativeGetAxisValue(Native Method)



如果有人可以帮助我解决我的问题,我将不胜感激。谢谢 !

最佳答案

要跟踪来自多个指针的触摸事件,您必须使用theMotionEvent.getActionIndex()theMotionEvent.getActionMasked()方法来标识指针的索引以及该指针发生的触摸事件。

该指针索引可以随时间变化,例如如果从设备上抬起一根手指。指针的稳定版本是指针ID,可以使用thegetPointerId(pointerIndex)对象中的MotionEvent方法确定它。

@Override
public boolean onTouchEvent(MotionEvent event)  
 { 
 // get pointer index from the event object int
  pointerIndex = event.getActionIndex();
// get pointer ID 
 int pointerId = event.getPointerId(pointerIndex);
// get masked (not specific to a pointer) action
 int maskedAction = event.getActionMasked();
 switch (maskedAction) 
       { 
        case MotionEvent.ACTION_DOWN: 
          case MotionEvent.ACTION_POINTER_DOWN:
             { 
                // TODO use data break;
             }
          case MotionEvent.ACTION_MOVE:
           {
           // a pointer was moved 
          // TODO use data break;
            } 
           case MotionEvent.ACTION_UP:
           case MotionEvent.ACTION_POINTER_UP:       
           case MotionEvent.ACTION_CANCEL:
           { 
            // TODO use data break; 
           }
      } 
 invalidate(); 
 return true;
 }

关于java - 如何使多点触控在Android中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55669470/

相关文章:

java - 如何从 Java 中获取 Acoustid (Chromaprint) 以识别 mp3/m4a/etc

java - 为什么在我的情况下服务没有启动?

java - 如何在 LibGDX 中添加触摸板

java - 将引用对象键设置为null不能按预期工作

java - 延迟加载不起作用 - 我只需要父对象,而不是所有关联

android:无法从 RecyclerView.ViewHolder 加载新 Activity

java - Android ListView onItemClick填充EditText

iphone - 如何使多个触摸按钮与touchesBegan/Moved一起使用?

ios - 如何禁用多次单击按钮?

java - 要求用户进行多个输入