Мультимедийные помехи для Android

В настоящее время я разрабатываю симуляцию воздушного хоккея для Android. Для многопользовательского режима я отслеживаю два события касания на экране, который работает хорошо, пока точки касания не закрываются. Normal Touch

Когда два пальца закрываются, андроид распознает только одно касание, посередине обеих точек.

Two events overlapping

Чтобы сделать это еще хуже, андроид иногда испортил идентификаторы после столкновения.

Wrong IDs assigned

Я уже думал об оценке следующих точек касания и назначении идентификаторов вручную, знает ли кто-нибудь лучший способ или знает кого-то, кто уже исправил эту проблему программно?

ПРИМЕЧАНИЕ. Я тестирую Samsung Galaxy S 3

Ответы

Ответ 1

Не обязательно логическое исправление проблемы, тем не менее, возможное решение для приложения:

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

Инкапсуляция отслеживаемых событий касания в допустимые физические местоположения, как описано, может просто помочь вам игнорировать неверные точки (учитывая, что физические местоположения не пересекаются, то есть).

Вам также может потребоваться отслеживать направление вектора касания: если вектор растягивается от центра экрана к "вашему концу", это могут быть противники, вторгающиеся в пальцы или ваш собственный возвращающийся палец. В любом случае они не должны влиять на хоккейную шайбу (возможно).

Ответ 2

Это может зависеть от устройства, которое вы используете, но я использую код ниже в Huawei X5, и он никогда не испортит пальцы, даже если они касаются друг друга, или я скручиваю их по экрану.

private static PointF touchScreenStartPtArr[] = new PointF[10];
private static PointF touchScreenStopPtArr[] = new PointF[10];
private static PointF touchScreenCurrPtArr[] = new PointF[10];

OnTouchListener onTouchListenerMulti = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        int fingerId = event.getPointerId(pointerIndex);

        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:
            touchScreenStartPtArr[fingerId].x = event.getX(pointerIndex);
            touchScreenStartPtArr[fingerId].y = event.getY(pointerIndex);
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:
            touchScreenStopPtArr[fingerId].x = event.getX(pointerIndex);
            touchScreenStopPtArr[fingerId].y  = event.getX(pointerIndex);
            break;
        case MotionEvent.ACTION_MOVE:
            int pointerCount = event.getPointerCount();
            for (int i = 0; i < pointerCount; i++) {
                touchScreenCurrPtArr[fingerId].x = event.getX(i);
                touchScreenCurrPtArr[fingerId].y = event.getY(i);
            }
            break;
        }
        return true;
    }
};  

Обратите внимание, что я использую fingerId, а не pointerId, чтобы идентифицировать правильный палец, поскольку идентификатор указателя может измениться при отпускании одного пальца.

Надеюсь, что это сработает для вас.

Ответ 3

Вот как я его вижу.

Аппаратное обеспечение сенсорного экрана дает вам разрешение, ниже которого два касания совпадают с одним. Это то, что вы не можете изменить.

Теперь вопрос в том, что делать, когда сливаются два касания? (Это то, что можно протестировать для программного мышления, например, если 2 touch pts → 1 touch pt. ​​AND prev touch pt 1 достаточно близко к предыдущему касанию pt 2...). В вашем случае я бы переместил оба шайбы по объединенному касанию, пока они не отделились, а затем вернул индивидуальный контроль.

Конечно, я вижу несколько проблем с этим, например, какие сенсорные элементы управления, которые шайба после раскола? Возможно, один человек поднял палец во время слияния.

Вы можете заставить обоих игроков потерять контроль над своей шайбой, если произойдет слияние. Это может имитировать удар в запястье, когда ваша рука впадает в вашего оппонента:)

Мне также нравится идея @dbm.

Надеюсь, это поможет. Наверное, не сделал:)