Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Обработка жестов в Android

#android_sdk #android


Как обрабатывать смахивания и жесты на представлениях?
    


Ответы

Ответ 1



Обработка жестов - тема очень обширная, здесь я попробую отметить только основные моменты. Что касается сложных геометрических жестов (например жест - квадрат и тп.), то подход здесь следующий: Для начала необходимо создать специальный файл, который будет хранить жесты и связывать их с идентификаторами. Создается такой файл с помощью утилиты Gestures Builder. В самом приложении необходимо разместить на разметке слой, который будет "принимать" жесты: Регистрируем на этот слой слушатель OnGesturePerformedListener, который будет обрабатывать жесты и через колбэк onGesturePerformed возвращать идентификаторы распознаных жестов. Подробнее смотрите, например, эту статью. Для обнаружения простых жестов, вроде смахивания, все гораздо проще. Вам нужно повесить слушатель OnTouchListener на свой элемент, который должен "понимать" смахивания. В колбэке интерфейса onTouch() регистрируется GestureDetector.OnGestureListener, который позволяет переопределить метод onFling() - обнаружение смахивания - в этом методе вы определяете логику действий при смахивании. Так же интерфейс распознает еще несколько действий: скроллинг, долгое касание и некоторые другие Простой пример: public class MyActivity extends Activity { private void onCreate() { final GestureDetector gdt = new GestureDetector(new GestureListener()); final ImageView imageView = (ImageView) findViewById(R.id.image_view); imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent event) { gdt.onTouchEvent(event); return true; } }); } private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_THRESHOLD_VELOCITY = 200; private class GestureListener extends SimpleOnGestureListener { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { return false; // справа налево } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { return false; // слева направо } if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { return false; // снизу вверх } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { return false; // сверху вниз } return false; } } } Более глубокое погружение в тему распознавания простых жестов - смотрите, например, эту статью.

Комментариев нет:

Отправить комментарий