Написание пользовательского слушателя жестов поворота для представлений Android

Всем привет! В команде Navigine мы уже восемь лет предоставляем мобильные технологии внутреннего и внешнего позиционирования, которые обеспечивают передовые решения внутренней навигации и бесконтактные решения.

В нашей предыдущей статье мы писали об обработке жестов касания, панорамирования и сжатия в представлениях Android с помощью детекторов жестов. Реализовать было довольно просто, потому что здесь использовались уже написанные Google детекторы жестов. Но теперь нам нужно будет написать собственные детекторы жестов, потому что готовых нет. Конечно, вы можете найти некоторые библиотеки и использовать их в своем проекте, но если вы можете писать сами, то почему бы и нет. Ну что ж, приступим.

Базовый детектор жестов

Мы планируем написать собственный детектор жестов вращения, но это наша конечная цель. Однако вы должны понимать, что перед достижением конечной цели вам необходимо выполнить несколько промежуточных целей. В нашем случае мы должны уметь распознавать жесты двумя пальцами, прежде чем обнаруживать вращение. Но прежде чем писать детектор жестов с двумя пальцами, мы должны написать базовый детектор жестов с базовыми методами, которые будут переопределены в расширенных классах. Таким образом, этот класс будет иметь абстрактные методы для определения начала и прогресса жеста, которые будут переопределены в следующих реализованных классах.

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

Детектор жестов двумя пальцами

Следующая интересная часть - написание пользовательского детектора жестов двумя пальцами. Этот класс был бы полезен при написании других детекторов жестов, где нам нужно будет обнаруживать события с двумя пальцами, такие как в данном случае поворот, толчок и т. Д.

Таким образом, этот класс расширит наш базовый детектор жестов, а также не будет переопределять наши абстрактные методы для запуска и выполнения жестов. Он также будет содержать метод обновления состояния по событию и вызовет метод суперкласса, в данном случае метод базовых детекторов жестов. Кроме того, он будет содержать несколько довольно простых методов для получения предыдущего и текущего диапазона, а также еще два метода для получения необработанных координат для осей x и y.

И последняя функция предназначена для проверки того, неаккуратный жест или нет. Эта функция будет полезна нам в следующих классах детекторов жестов. Это также выглядит простым и понятным. Итак, приступим к самой интересной части нашей статьи - реализации класса определения жестов поворота.

Детектор жестов поворота

Во-первых, наш класс должен расширить класс детектора жестов двумя пальцами. Затем нам нужно будет создать некоторый интерфейс для слушателя, чтобы пользователи получали там события и переопределяли поведение своего представления по своему усмотрению. В нашем случае у этого слушателя будут методы для начала, вращения и конца вращения. Мы передадим туда наш класс детектора жестов, чтобы пользователь мог вызывать любой публичный метод, который пожелает.

Наконец-то настал момент реализации начатого жеста и способов продвижения. Это будет довольно просто, мы проверим тип события движения и обновим наше состояние. Кроме того, у нашего класса будут общедоступные геттеры, поэтому пользователь сможет получить эти данные.

Заключение

Как видите, детектор жестов поворота не такой сложный, как могло показаться перед стартом. Обычно это случается всегда, что-то кажется нам гораздо более сложным, потому что нам все еще может быть немного страшно выйти из своей зоны комфорта и начать это делать. Надеюсь, статья будет вам полезна и вы сможете использовать ее в своих проектах, но даже если нет, то извлеките для себя что-нибудь полезное.