Intereting Posts
Проблема совместимости с градиентом – ICS по умолчанию уменьшает количество цветов, чем все предыдущие версии Android Использование нескольких DotSpan в MaterialCalendarView Replace () не работает должным образом с несколькими фрагментами Зачем использовать «обычные» фрагменты, если у вас есть пакет совместимости с Android? Как получить силу соединения точек доступа Wi-Fi? Уведомление с использованием RemoteViews не работает Перевести вид с одного макета на другой с переводом анимации Ctrl click class в Eclipse показывает двоичный / jar вместо источника Почему DrawerLayout иногда сбой при открытии? Android-микрофон не работает, когда он используется другим приложением в фоновом режиме Разрешить щелчок прямоугольником – андроид Как отключить манифест слияния в Android Studio Android – Grow Heap (Frag Case) – Байт-распределение. Не загружайте растровые изображения Как изменить цвет гиперссылки в андроиде Как использовать многостраничную панель инструментов Text в адаптере списка?

Android multitouch: ACTION_UP не всегда называется?

Я разработал приложение для Android, которое обрабатывает мультитач в представлении. Я в основном отслеживаю несколько MotionEvents, которые могут встречаться как ACTION_UP, ACTION_MOVE, … Мой перезаписанный метод onTouch в классе View выглядит следующим образом:

public boolean onTouch(View view, MotionEvent event) { int action = event.getAction() & MotionEvent.ACTION_MASK; if (action == MotionEvent.ACTION_DOWN) { float x = event.getX(); handleTouchStart(view, x); } else if (action == MotionEvent.ACTION_UP) { float x = event.getX(); handleTouchEnded(view, x); } else if (action == MotionEvent.ACTION_POINTER_DOWN) { int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; float x = event.getX(pointer); handleTouchStart(view, x); } else if (action == MotionEvent.ACTION_POINTER_UP) { int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; float x = event.getX(pointer); handleTouchEnded(view, x); } else if (action == MotionEvent.ACTION_MOVE) { int pointer = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; float x = event.getX(pointer); handleTouchMoved(view, x); } return true; } 

На моем телефоне (Samsung Galaxy S) это работает безупречно. Для каждого handleTouchStart () вызывается соответствующий handleTouchEnded (). Это очень важно для моего приложения. Это двухпроходный прокруткой с рулевой зоной в левой нижней части экрана. Если – по какой-либо причине – метод handleTouchEnded () не вызывается, когда пользователь поднимает палец с сенсорного экрана, персонаж игрока продолжает работать.

Я получил отчеты от игроков на других устройствах (например, HTC Desire), что в редких случаях персонаж действительно продолжает работать в направлении, даже если они подняли палец от области рулевого управления на экране. Я пришел к выводу, что это может произойти только в том случае, если handleTouchEnded () не вызывается, что, в свою очередь, означает, что не генерируется событие ACTION_UP (или ACTION_POINTER_UP).

Существуют ли специфические реализации мультитач-поддержки устройства? Нет ли гарантии, что для каждого MotionEvent ACTION_DOWN (или ACTION_POINTER_DOWN) вызывается соответствующий MotionEvent ACTION_UP (или ACTION_POINTER_UP)? Или я чего-то не хватает? Является ли моя реализация onTouch даже правильной?

Мой более широкий вопрос: есть ли способы управления мультитач-сенсорным вводом для «action» -games? Я в основном имитирую левый и правый элементы управления рулевого креста геймпада. Я обнаружил, что кнопки пользовательского интерфейса Android не обеспечивают достаточной гибкости, потому что они не могут отслеживать события onPress и onRelease … или они?

Вы что-то упустили. 😉 Существует еще один тип действия, с которым вы должны обращаться: ACTION_CANCEL . ACTION_CANCEL отправляется, когда ACTION_CANCEL ход прерывается на некотором более высоком уровне – какой-то компонент более высокого уровня может перехватить жест и передать его и т. Д.