按下垃圾邮件时多点触摸崩溃

daupos2t  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(135)

我目前正在开发一个简单的应用程序/手机游戏,用户可以按屏幕的左侧来控制一件事,而屏幕的右侧则可以控制另一件事,双方应该可以同时按下,所以我尝试实现一种多点触摸的方法。这是一个学校任务,老师测试了我的多点触摸功能的极限。据我所知,他基本上是在尽可能地按下屏幕,这反过来会产生以下错误消息:

2021-06-13 11:37:47.551 3408-3408/ E/MessageQueue-JNI: java.lang.ArrayIndexOutOfBoundsException: length=2; index=2
at Game.onTouchEvent(Game.java:350)
at android.view.View.dispatchTouchEvent(View.java:13431)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3060)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2755)
at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:465)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1849)
at android.app.Activity.dispatchTouchEvent(Activity.java:3996)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:423)
at android.view.View.dispatchPointerEvent(View.java:13690)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:5483)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5286)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:4948)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5005)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4842)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4808)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4816)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4789)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:7512)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:7481)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:7442)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:7637)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:189)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:336)
at android.os.Looper.loop(Looper.java:174)
at android.app.ActivityThread.main(ActivityThread.java:7403)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

这是多点触摸的代码:

@Override
    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getActionMasked();
        if ((action & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_POINTER_DOWN) {
            int count = event.getPointerCount();
            if (count > 2)
                return true;
        }
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        int pointerID = event.getPointerId(pointerIndex);
        if(pointerID > 2){
            return true;
        }
        int[] touchX = new int[event.getPointerCount()];

        for(int i = 0 ; i < event.getPointerCount() ; i++){
            touchX[i] = (int) event.getX(i);
        }

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (touchX[0] < screenX / 2) {
                    astronaut.isGoingUp = true;
                }
                break;
            case MotionEvent.ACTION_UP:
                astronaut.isGoingUp = false;
                if (touchX[0] > screenX / 2) {
                    astronaut.toShot++;
                }
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                if(touchX[pointerID] < screenX / 2) {
                    astronaut.isGoingUp = true;
                }
            case MotionEvent.ACTION_POINTER_UP:
                if(touchX[pointerID] > screenX / 2){
                    astronaut.toShot++;
                }
            default:
                break;

        }
        return true;
    }

我试图了解如何应对此错误消息,但似乎无法使其按我希望的方式工作。我的第一个想法是将多点触摸限制为只有两个手指,但结果适得其反。我的方法中是否有什么地方做错了,或者我对ontouchevent方法的用法理解有误。
谢谢

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题