Android мультитач: ACTION_UP не всегда вызывается? - PullRequest
7 голосов
/ 08 мая 2011

Я разработал приложение для 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 ... или нет?

1 Ответ

15 голосов
/ 08 мая 2011

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

...