pointerIndex вне диапазона Android multitouch

У меня есть событие с событием с сенсорным событием, которое приводит к сбою моей игры на планшетах (или, более конкретно, сотовых) … Моя игра отлично работает на моем телефоне, и я не слышал об этом, что происходит с кем-либо, у которого не работает Android 3.0 или выше. Вот соответствующая информация журнала …

E/AndroidRuntime(26487): java.lang.IllegalArgumentException: pointerIndex out of range E/AndroidRuntime(26487): at android.view.MotionEvent.nativeGetAxisValue(Native Method) E/AndroidRuntime(26487): at android.view.MotionEvent.getX(MotionEvent.java:1549) E/AndroidRuntime(26487): at kieran.android.asteroids.GameUI.onTouchEvent(GameUI.java:665) E/AndroidRuntime(26487): at android.view.View.dispatchTouchEvent(View.java:4616) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1560) E/AndroidRuntime(26487): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1291) 

… И вот код, который его вызывает. Кажется хорошо для меня, но, может быть, в сотах есть ошибка, которая еще не исправлена? Номер строки 665 из журнала выше соответствует float x = event.getX(id); линия. Это должно иметь какое-то отношение к тому, как я могу получить переменную? Но он отлично работает на телефонах / 2.3 и ниже …

 int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; if(actionCode == MotionEvent.ACTION_POINTER_UP || action == MotionEvent.ACTION_UP) { int which = action >> MotionEvent.ACTION_POINTER_ID_SHIFT; int id = event.getPointerId(which); float x = event.getX(id); float y = event.getY(id); 

Любая помощь / идеи были бы очень благодарны, поскольку я пытаюсь сделать свою игру доступной для пользователей планшетов. Благодарю.

Моя проблема заключалась в том, что на самом деле он вызывал event.getX (1), когда на самом деле не было двух идентификаторов. Поэтому я убедился, что есть два идентификатора с event.getPointerCount ()> = 2, и теперь он работает. Может быть, у вас будет такая же удача!

Ваш недостаток в нескольких вещах, вам нужно применить маску к указателю в противном случае, поскольку вы не получаете технически доступ к идентификатору пальца, который, по вашему мнению, вы

 int action = event.getAction() & MotionEvent.ACTION_MASK; int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; int pointerId = event.getPointerId(pointerIndex); 

Просто измените getPointerId() на findPointerIndex() . Возможно, измените geAction() на getActionMasked() .

Надеюсь, поможет!

У меня также есть эта ошибка, но ни одно из решений до даты моего сообщения не работает. Единственное временное псевдо-исправление, которое работает для меня, – использовать попытку try против IllegalArgumentException .

Согласно Android Issue 18990 , это связано с ScaleGestureDetector, и исправление было совершено несколько дней назад.

Первоначальная публикация использует идентификатор указателя, когда getX и getY используют указатель указателя.

Он работает, когда вы используете идентификатор для одного касания, потому что идентификатор и индекс равны 0. Это испортится, если вы используете мультитач, потому что индексы могут измениться.

Пример:

Нажмите 1 Вниз.
Нажмите 1 Индекс состояния = 0. ID = 0

Коснитесь 2 Вниз.
Нажмите 1 Индекс состояния = 0. ID = 0
Коснитесь 2 State Index = 1. ID = 1

Нажмите 1 Release.
Нажмите 2 State Index = 0 . ID = 1

Попробуйте следующий код:

 final int action = e.getAction(); final int pointerIndex =(action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; float x = event.getX(pointerIndex); float y = event.getY(pointerIndex); 
  • getSearchForm возвращает значение null при использовании UserSearch в XMPP с помощью aSmack
  • Почему у RecyclerView нет onItemClickListener ()?
  • Как обрезать изображение на Java?
  • Приложение для Android в Eclipse: редактирование текста, не отображаемого на графическом макете
  • Apache http client или URLConnection
  • Невозможно скомпилировать проект, когда я использую Lombok под IntelliJ IDEA
  • java.lang.IllegalStateException: только непрозрачные действия в полноэкранном режиме могут запрашивать ориентацию
  • Как установить фоновые рисунки программно в Android
  • Завершение программы Java
  • Ошибка при создании apk - «Несколько файлов dex определяют Lcom / google / ads / Ad»
  • Bitmap getWidth возвращает неверное значение
  • Давайте будем гением компьютера.