Обработка сенсорных событий

Создание объектов, которые движутся в соответствии с заранее заданной программой часто бывает полезным, но что если вы хотите, чтобы пользователи могли взаимодействовать с графическими объектами? Ключевым моментом добавления интерактивности, является расширение класса GLSurfaceView и переопределение метода onTouchEvent(), который будет отслеживать сенсорные события.

В уроке показано как отслеживать сенсорные события, чтобы позволить пользователям вращать нарисованный объект OpenGL.

Отслеживаем сенсорные события

Чтобы сделать OpenGL приложение отзывчивым на события, необходимо добавить метод onTouchEvent() в ваш класс-наследник GLSurfaceView. Пример отслеживания события MotionEvent.ACTION_MOVE и перевод его состояния в угол вращения фигуры:

Помните, что после расчета угла поворота, метод вызывает requestRender(), чтобы сообщить, что пришло время перерисовать контейнер. Такой подход наиболее эффективен в данном случае, поскольку нет необходимости в перерисовке, если не произошло событие, в ответ на которое надо повернуть фигуру. Однако, это никак не повлияет на эффективность, если вы забудете указать опцию для перерисовки контейнера только при изменении данных с помощью метода setRenderMode(). Давайте вновь его раскомментируем:

Выставляем угол поворота

Пример, приведенный выше требует добавить открытый член класса для установки угла поворота. Поскольку код визуализации работает в отдельном потоке, вы должны объявить открытую переменную как volatile:

Применяем вращение

Чтобы применить вращение, сгенерированное сенсорным событием, закомментируйте код, который генерирует угол и добавьте переменную mAngle, которая хранит угол, заданный сенсорным событием:

Если вы внимательно прошли все шаги, описанные выше, запустите вашу программу и подвигайте пальцем по экрану, чтобы вращать треугольник:

Рисунок 1. треугольник вращается в ответ на прикосновения к экрану (круг показывает положение пальца)

Добавить комментарий