我有一个操纵杆应用程序,我正在实施,并在处理动作事件时遇到问题 . 除了我试图在ACTION_MOVE之后捕获事件之外,大部分工作都很好 . 因此,在用户完成拖动操纵杆之后,我想在MotionEvent案例中执行一些代码 . ACTION_UP不满足此要求,尽管在ACTION_MOVE之后放置ACTION_UP确实有效,并且一切运行正常,但仅在调试模式下而不是在实际运行程序时非常奇怪 . 这是有问题的代码:

public boolean onTouch(View v,MotionEvent me){

switch(v.getId()) {
            case R.id.x_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "X";
                       new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;

                }
                break;


            case R.id.a_button:
                 switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "Q";
                       new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }


                break;

            case R.id.y_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "Y";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }
                break;

            case R.id.b_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "B";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }
                break;

            case R.id.start_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "START";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }
                break;

            case R.id.select_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "SELECT";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;

                    case MotionEvent.ACTION_CANCEL:

                        break;
                }
                break;

            case R.id.rb_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "RB";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }
                break;

            case R.id.lb_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "LB";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:
                        break;
                }
                break;

            case R.id.rt_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "RT";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:
                        break;
                }
                break;

            case R.id.lt_button:
                switch(me.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        buttonPressed = "LT";
                        new SendServer().execute();
                        break;

                    case MotionEvent.ACTION_UP:

                        break;
                }





            case R.id.analogStick:

                switch(me.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:
                        x = me.getRawX();
                        y = me.getRawY();
                        System.out.println(x);
                        System.out.println(y);
                        dx = x - v.getX();
                        dy = y - v.getY();
                        //direction_result = sendDirection(originX, originY, me.getRawX(), me.getRawY());
                        //new SendServer().execute();
                        break;



                    case MotionEvent.ACTION_MOVE:

                       float xx = (me.getRawX() - originX) - dx;
                       float yy = (me.getRawY() - originY) - dy;

                       float displacement = (float) Math.sqrt((xx * xx) + (yy * yy));
                            if (displacement < deadzoneRadius) {
                                v.setX(me.getRawX() - dx);
                                v.setY(me.getRawY() - dy);
                                direction_result = sendDirection(originX, originY, me.getRawX(), me.getRawY());
                                new SendServer().execute();
                                System.out.println(me.getRawX() - dx);
                                System.out.println(me.getRawY() - dy);

                            }

                            else {
                                float ratio = (float) deadzoneRadius / displacement;
                                float constrainedX = originX + ((me.getRawX() - originX) - dx) * ratio;
                                float constrainedY = originY + ((me.getRawY() - originY) - dy) * ratio;
                               direction_result = sendDirection(originX, originY, me.getRawX(), me.getRawY());
                                new SendServer().execute();
                                v.setX(constrainedX);
                                v.setY(constrainedY);
                                me.getActionMasked();
                            }
                            break;

                    case MotionEvent.ACTION_UP:
                        xDirection2 = me.getRawX();
                        yDirection2 = me.getRawY();
                        delta_xDirection = x - xDirection2;
                        delta_yDirection = y - yDirection2;
                        v.setX(originX);
                        v.setY(originY);
                        resetKeyboardState();
                        new SendServer().execute();
                        break;



                }
                break;
        }

        return true;
    }

此外,我的问题似乎与这篇文章非常相似,尽管如果这有帮助就永远无法回答:how to detect when MotionEvent.ACTION_MOVE is finished