Жесты onFling() не точны

Итак, у меня есть следующее тело для моего метода onFling():

    public boolean onFling(MotionEvent e1, MotionEvent e2,
                         float velocityX, float velocityY) {
      try {

        // Left swipe
        if ( velocityX < -SWIPE_THRESHOLD_VELOCITY) {
            if( velocityY < -SWIPE_THRESHOLD_VELOCITY) {
                GameWindow.writeToOutput("northwest");
                Log.d("Console","Wrote NW");
            }
            else
                GameWindow.writeToOutput("west");

            return true;
        // Right swipe
        } else if (velocityX > SWIPE_THRESHOLD_VELOCITY) {

            if( velocityY < -SWIPE_THRESHOLD_VELOCITY) {
                GameWindow.writeToOutput("northeast");
                Log.d("Console","Wrote NE");
            }
            else
                GameWindow.writeToOutput("east");

            return true;

        }

        if ( velocityY > SWIPE_THRESHOLD_VELOCITY) {

            GameWindow.writeToOutput("south");

            return true;
        }


        if ( velocityY < -SWIPE_THRESHOLD_VELOCITY) {

            GameWindow.writeToOutput("north");

            return true;
        }
      } catch (Exception e) {
        Log.e("YourActivity", "Error on gestures");
      }

      return false;
    }

Моя проблема заключалась в том, что я сделаю «бросок» вверх влево, но вместо этого скорости внезапно отобразятся в логарифме, который я сделал «бросок» в противоположном направлении. Может ли это быть проблемой эмулятора, или мой код не точно измеряет направление моего жеста?


person Jon    schedule 05.05.2013    source источник
comment
Это хорошее базовое предположение, чтобы начать с того, что ошибка находится в вашем коде, а не в эмуляторе. Проверив свой код и убедившись, что он работает, вы можете начать сомневаться в эмуляторе.   -  person dutt    schedule 05.05.2013
comment
Итак, я вставил несколько строк логарифма, чтобы распечатать скорости X и Y, иногда они кажутся довольно неустойчивыми. Жест вверх, который должен создавать -velocityY, иногда ведет себя правильно, но в других случаях значение внезапно становится положительным, а это не то, чего я хочу. Есть ли способы исправить это с помощью эмулятора? Я отправил свой .apk другу, и он сказал, что на реальном устройстве он ведет себя так, как я и ожидал.   -  person Jon    schedule 05.05.2013


Ответы (1)


Хорошо, Датт был прав, и я хотел бы отдать ему должное за это. Я изменил свой код, чтобы более точно измерять жесты, и на случай, если кто-то захочет использовать этот код, он приведен ниже. Мне придется немного изменить чувствительность, так как вверх-влево не будут иметь такие высокие значения, как прямо вверх, но это действительно надежная отправная точка.

    public boolean onFling(MotionEvent e1, MotionEvent e2,
                         float velocityX, float velocityY) {
      try {
          double xDir = e1.getX() - e2.getX();
          double yDir = e1.getY() - e2.getY();

          Log.d("Console","xVel = " + xDir);
          Log.d("Console","yVel = " + yDir);

        if ( xDir > SWIPE_THRESHOLD_VELOCITY) {
            if( yDir > SWIPE_THRESHOLD_VELOCITY) {
                //Up-Left swipe
                GameWindow.writeToOutput("northwest");
            }
            else  if ( yDir < -SWIPE_THRESHOLD_VELOCITY){
                //Down-Left swipe
                GameWindow.writeToOutput("southwest");
            }
            else{
                //Left swipe
                GameWindow.writeToOutput("west");
            }

            return true;
        } else if (xDir < -SWIPE_THRESHOLD_VELOCITY) {

            if( yDir > SWIPE_THRESHOLD_VELOCITY) {
                //Up-Right swipe
                GameWindow.writeToOutput("northeast");
            }else  if ( yDir < -SWIPE_THRESHOLD_VELOCITY){
                //Down-Right swipe
                GameWindow.writeToOutput("southeast");
            }
            else {
                //Right swipe
                GameWindow.writeToOutput("east");
            }

            return true;

        }

        if ( yDir < -SWIPE_THRESHOLD_VELOCITY) {
            //Down swipe
            GameWindow.writeToOutput("south");
            return true;
        }


        if ( yDir > SWIPE_THRESHOLD_VELOCITY) {
            //Up swipe
            GameWindow.writeToOutput("north");
            return true;
        }
      } catch (Exception e) {
        Log.e("YourActivity", "Error on gestures");
      }

      return false;
    }
person Jon    schedule 05.05.2013
comment
Каковы были бы достойные значения для этих констант? - person android developer; 10.01.2015