2016-06-02 8 views
1

Я разрабатываю игру с LibGDX, и у меня возникают проблемы с определением fling от pan.Определение бросания с кастрюли в libgdx

Мои GestureListener:

@Override 
public boolean fling(float velocityX, float velocityY, int button) { 
    //if (velocityX > 1000f) { 
    // I can use this to exclude slow pans from the executing a fling 
     System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button); 
    //} 
    return false; 
} 

@Override 
public boolean pan(float x, float y, float deltaX, float deltaY) { 
    // but there doesn't seem to be a way to have this not fire on a fling 
    System.out.println("Panned - deltaX: " + deltaX); 
    return false; 
} 

@Override 
public boolean panStop(float x, float y, int pointer, int button) { 
    System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button); 
    return false; 
} 

Проблема заключается в том, что если оба pan и fling огонь. Я понимаю, что fling в основном быстрый pan, но мне нужно иметь возможность определить между двумя жесты, чтобы я мог обрабатывать каждый отдельно.

Как я могу предоставить уникальные действия для fling и pan?

ответ

0

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

Вот как я вижу это:

//the flag for checking if pan mode entered 
    boolean PAN = false; 

    @Override 
    public boolean longPress(float x, float y) { 
     PAN = true; 
     return false; 
    } 

    @Override 
    public boolean fling(float velocityX, float velocityY, int button) { 
     if(!PAN) { 
      System.out.println("Flinged - velocityX: " + velocityX + ", button: " + button); 
     } 
     return false; 
    } 

    @Override 
    public boolean pan(float x, float y, float deltaX, float deltaY) { 
     if(PAN) { 
      System.out.println("Panned - deltaX: " + deltaX); 
     } 
     return false; 
    } 

    @Override 
    public boolean panStop(float x, float y, int pointer, int button) { 
     if(PAN) { 
      PAN = false; 
      System.out.println("Pan Stop - pointer: " + pointer + ", button: " + button); 
     } 
     return false; 
    } 

Конечно, если longPress слишком долго для ваших целей вы можете изменить его, используя setLongPressSeconds(float longPressSeconds) метод GestureDetector экземпляра

+0

Это технически работает, но, кажется, невозможно получить «почувствовать» право. Я могу обнаружить между панорамированием и стрельбой, однако я долгое время играл с длительной продолжительностью нажатия, и кажется, что почти невозможно получить хороший номер для этого. ~ 100 мс (0,1 с), казалось, работал лучше всего для меня во время тестирования на моем Nexus 5, но это было непротиворечиво. Иногда то, что казалось мне кастрюлем (медленнее, чем салфетка/бросок), не регистрировалось, а иногда и так. – Townsfolk