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

时间:2019-04-13 20:15:28

标签: java android multi-touch ontouchevent

我正在用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)

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

2 个答案:

答案 0 :(得分:0)

要跟踪来自多个指针的触摸事件,您必须使用QListWidgetmenu.exec(ui->listWidget->viewport()->mapToGlobal(pos)); 方法来标识指针的索引以及该指针发生的触摸事件。

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

thegetPointerId(pointerIndex)

答案 1 :(得分:0)

谢谢您的回答,但是使用getActionMasked()和getActionIndex()仍然存在此问题...这是我的新代码:

@SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //Detection du nombre de doigts sur l'écran et deplacement des joueurs en fonction de la position des doigts
        int pointerCount = event.getPointerCount();
        for(int i=0; i<pointerCount; i++) {
            int pointerIndex = event.getActionIndex();
            int pointerId    = event.getPointerId(pointerIndex);
            int maskedAction = event.getActionMasked();

            switch(maskedAction) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:

                    break;

                case MotionEvent.ACTION_MOVE:
                    int x = (int) event.getX(pointerId);
                    int y = (int) event.getY(pointerId);

                    this.posX = x; this.posY = y;

                    //Déplacement du joueur 1
                    if (posX >= joueur1.getX()-joueur1.getRayon() && posX <= joueur1.getX()+joueur1.getRayon()
                        && posY >= joueur1.getY()-joueur1.getRayon() && posY <= joueur1.getY()+joueur1.getRayon()
                        && posY < this.height/2-joueur1.getRayon()) {

                        joueur1.setX(posX);
                        joueur1.setY(posY);
                    }
                    //Déplacement du joueur 2
                    if (posX >= joueur2.getX()-joueur2.getRayon() && posX <= joueur2.getX()+joueur2.getRayon()
                            && posY >= joueur2.getY()-joueur2.getRayon() && posY <= joueur2.getY()+joueur2.getRayon()
                            && posY > this.height/2+joueur2.getRayon()) {

                        joueur2.setX(posX);
                        joueur2.setY(posY);
                    }
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL:
                    break;
            }
        }
        return true;

我需要使用for循环使多点触控正常工作吗?因为如果我不这样做,只能移动一个玩家。