Я разработал приложение для 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 ().Это очень важно для моего приложения.Это 2D боковой скроллер с областью рулевого управления в левой нижней части экрана.Если - по какой-то причине - метод handleTouchEnded () не вызывается, когда пользователь убирает палец с сенсорного экрана, персонаж игрока продолжает работать.
Я получил отчеты от игроков на других устройствах (например, HTCЖелание), чтобы в редких случаях персонаж действительно продолжал бежать в направлении, даже если он поднял палец от области управления на экране.Я пришел к выводу, что это может произойти только в том случае, если handleTouchEnded () не вызывается, что, в свою очередь, означает, что событие ACTION_UP (или ACTION_POINTER_UP) не генерируется.
Существуют ли конкретные реализации устройства поддержки мультитач?Нет ли гарантии, что для каждого ACTION_DOWN (или ACTION_POINTER_DOWN) MotionEvent вызывается соответствующий ACTION_UP (или ACTION_POINTER_UP) MotionEvent?Или я что-то упустил?Правильно ли реализована моя реализация onTouch?
Мой более широкий вопрос: есть ли более эффективные способы обработки ввода с сенсорным экраном с несколькими касаниями для игр-экшенов?Я в основном имитирую левый и правый органы управления рулевого управления геймпада.Я обнаружил, что кнопки пользовательского интерфейса Android не обладают достаточной гибкостью, потому что они не могут отслеживать события onPress и onRelease ... или нет?