проведите пальцем влево, вправо, вверх и вниз в зависимости от скорости или других переменных - PullRequest
4 голосов
/ 17 июля 2011

у меня есть класс, расширенный от простого на жесте, и я работаю с методом onfling:

class MyGestureListener extends GestureDetector.SimpleOnGestureListener{
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        // TODO Auto-generated method stub
        float e1_X = e1.getX();
        float e1_Y = e1.getY();
        float e2_X = e1.getX();
        float e2_Y = e2.getY();
        if(velocityX > 0 && velocityX > velocityY){
            text.setText("Swipe left");
        }else if(velocityX < 0 && velocityX < velocityY){
            text.setText("Swipe right");
        }else if(velocityY < 0 && velocityX > velocityY){
            text.setText("Swipe down");
        }else if(velocityY > 0 && velocityX < velocityY){
            text.setText("Swipe up");
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }
}

Я знаю, что это зависит от определенных углов, но я не могу это сделать, я пыталсясо скоростью X и скоростью Y, это работает, только если вы делаете это точно.Но то, что я хочу, это угол «ошибки»: если вы проводите по диагонали, например, вверх и вправо, мне нужно выбрать, какой путь лучше.

1 Ответ

4 голосов
/ 17 июля 2011

Вы должны проверить скорость и расстояние.Вот пример горизонтального детектора.Вы можете добавить вертикальное обнаружение таким же образом.

public class HSwipeDetector extends SimpleOnGestureListener {
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_THRESHOLD_VELOCITY = 200;

    @Override
    public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {  return false;  }

        /* positive value means right to left direction */
        final float distance = e1.getX() - e2.getX();
        final boolean enoughSpeed = Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY;
        if(distance > SWIPE_MIN_DISTANCE && enoughSpeed) {
            // right to left swipe
            onSwipeLeft();
            return true;
        }  else if (distance < -SWIPE_MIN_DISTANCE && enoughSpeed) {
            // left to right swipe
            onSwipeRight();
            return true;
        } else {
            // oooou, it didn't qualify; do nothing
            return false;
        }
    }

    protected void onSwipeLeft() { 
        // do your stuff here
    }

    protected void onSwipeRight() {   
        // do your stuff here
    }
}
...