Android MotionEvent: узнайте, произошло ли движение за пределами представления

У меня есть кнопка и OnTouchListener, прикрепленная к ней. Как я могу найти, произошло ли движение (когда пользователь нажимает кнопку) внутри или снаружи? И event.getAction (), и event.getActionMasked () возвращают только 0, 1 или 2, которые являются ActionDown, ActionUp, ActionMove, соответственно. Существует постоянный MotionEvent.ACTION_OUTSIDE, который равен 4, но каким-то образом я его не получаю, даже если я перетаскиваю контакт за пределы кнопки – я все равно получаю 2 от обоих методов. В чем проблема?

UPD: Я нашел хорошее решение – просто проверьте сфокусированное состояние на виду после ACTION_UP. Если это не сфокусировано, это означает, что движение произошло за пределами представления.

Этот флаг применяется только к Windows, а не к Views. Вы получите ACTION_MOVE когда вы перемещаете палец с представления, событие остается в представлении «Представление». Посмотрите на исходный код для SeekBar если вам нужно уточнение: даже если вы отпустите палец с панели, большой палец все еще тянет!

Для этого на уровне окна используйте FLAG_WATCH_OUTSIDE_TOUCH , он работает нормально.

Если OnTouchListener находится на Button , вы будете получать события движения только внутри Button . MotionEvent.ACTION_OUTSIDE будет MotionEvent.ACTION_OUTSIDE только тогда, когда событие движения сначала выходит за пределы View , и вы должны относиться к нему так же, как к ACTION_UP .

case MotionEvent.ACTION_CANCEL работал для меня.

MotionEvent.ACTION_OUTSIDE не работает для View.

Одно из решений – получить позицию касания X и Y и проверить, находится ли она в пределах видимости. Это можно сделать так:

 @Override public boolean onTouchEvent(MotionEvent e) { if (e.getX()<0 || e.getY()<0 || e.getX()>getMeasuredWidth() || e.getY()>getMeasuredHeight()) Log.i(TAG, "TOUCH OUTSIDE"); else Log.i(TAG, "TOUCH INSIDE"); return true; } 
Intereting Posts
Подпишите Android APK с сертификатом, который истекает в будущем Профисы и минусы Android: Event Bus и RxJava Ошибка при получении Карт Google в android Отладочные модульные тесты с использованием IntelliJ / AndroidStudio Как перезагрузить эмулятор устройства Android в Genymotion Как подготовить файл для мойки телефона Идентификатор ресурса не найден для атрибута 'layout_behavior' в пакете Android Добавление нового календаря Как конвертировать дату в определенном формате в android? AdMob Native Ads внутри Recylerview отображает пустое пространство перед загрузкой Использование Google Analytics в Android-приложении с активностью пользовательского интерфейса и бесконечным фоновым сервисом Завершить работу в диалоговом классе Получите целочисленное значение из файла ресурсов dimens.xml в Android Как исправить этот код все экраны андроида Остановите службу, если ни один из действий не находится на переднем плане