Intereting Posts
Отказывается плохо для производительности программы в OpenGL? Android adb (OSX Lion) не распознает Galaxy Nexus, Jelly Bean Android AlarmManager setExact () не является точным Показывать значение по умолчанию в Spinner в android Как сохранить файл на SD-карту Кнопка Fragment Butterknife не работает Использование wakelock в сервисе Android 1.5 Отформатируйте относительную дату в формате, удобочитаемом человеком, на Android, используя Android DateUtils API Гибридные мобильные приложения, как правило, считаются уступающими по отношению к собственным приложениям разработчиками в технологической отрасли? Кто-нибудь успешно ограничил размер кеша WebView? Этот класс Handler должен быть статическим или может возникнуть утечка: final Handler Текст текста в виде андроида в вертикальном направлении FindViewById (android.R.id.progress) возвращает null Как использовать локальную зависимость aar? Android – fragmentTransaction.replace () не работает в библиотеке поддержки 25.1.0

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

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

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

Два перекрытия событий

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

Неверные идентификаторы

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

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

Solutions Collecting From Web of "Мультимедийные помехи для Android"

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

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

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

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

Это может зависеть от устройства, которое вы используете, но я использую код ниже в 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, чтобы определить правильный палец, поскольку идентификатор указателя может измениться при отпускании одного пальца.

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

Вот как я это вижу.

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

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

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

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

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

Надеюсь это поможет. Наверное, не было 🙂