Вторник, 2024-03-19, 8:47 AM

Поиск
Меню
Категории раздела
Поддержи проект!
Рекомендуем


Обнаружение жестов

Сенсорные экраны хорошо подходят для ввода жестов. Жестом может быть использование двух пальцев для масштабирования, прикосновение или двойное прикосновение, долгое нажатие и так далее.

Libgdx предоставляет GestureDetector (исходники), который позволяет вам обнаружить следующие жесты:

  • tap: пользователь прикасается к экрану и затем поднимает палец. Палец не должен выходить за пределы указанной квадратной области вокруг исходного положения для зарегистрированы tap жеста. Многократные последовательные tap жесты будут обнаружены, если пользователь выполняет tap жест в течение заданного интервала времени.
  • pan: пользователь двигает пальцем по экрану. Детектор сообщит координаты текущего прикосновения, а также разницу между позицией текущего и предыдущего прикосновения. Используется для реализации панорамирование камеры в 2D.
  • fling: пользователь передвигал палец по экрану, а затем поднял его. Используется для реализации жеста скольжения.
  • zoom: пользователь помещает два пальца на экран и перемещает их вместе друг от друга. Детектор сообщает о начальном и текущем расстоянии между пальцами в пикселях. Используется для реализации масштабирования камеры.
  • pinch: Похожи на zoom. Детектор вместо расстояния будет сообщать о первоначальном и текущем положении пальцев. Используется для реализации масштабирования камеры и более сложный жестов, так как вращение.

GestureDetector является обработчиком событий для жестов. Для перехвата жестов можно реализовать GestureListener интерфейс и передать его в конструктор GestureDetector класса. Затем детектор устанавливается как InputProcessor, либо как InputMultiplexer или в качестве основного InputProcessor:

public class MyGestureListener implements GestureListener {

   @Override
   public boolean touchDown (int x, int y, int pointer) {
      return false;
   }

   @Override
   public boolean tap (int x, int y, int count) {
      return false;
   }

   @Override
   public boolean longPress (int x, int y) {
      return false;
   }

   @Override
   public boolean fling (float velocityX, float velocityY) {
      return false;
   }

   @Override
   public boolean pan (int x, int y, int deltaX, int deltaY) {
      return false;
   }

   @Override
   public boolean zoom (float originalDistance, float currentDistance) {
      return false;
   }

   @Override
   public boolean pinch (Vector2 initialFirstPointer, Vector2 initialSecondPointer, Vector2 firstPointer, Vector2 secondPointer) {
      return false;
   }
}
Gdx.input.setInputProcessor(new GestureDetector(new MyGestureListener()));

GestureListener может сигнализировать о том, что он получил событие или что хочет передать его дальше следующему InputProcessor, возвращая из методов true или false соответственно.

Как и для событий сообщенных обычному InputProcessor, соответствующие методы будут вызваны в потоке визуализации перед непосредственным вызовом ApplicationListener.render() метода.

GestureDetector также имеет второй конструктор, который позволяет ему определить различные параметры для обнаружения жеста. Пожалуйста, для получения дополнительной информации обратитесь к Javadoc конструктора GestureDetector.