Intereting Posts
Android – как установить изображение обоев Android: настройка вкладок в состоянии: как сделать селектор доступным Тень не работает при использовании панели инструментов (Lollipop appcompat-v7) AlertDialog.Builder: нет элементов для флажков Скрытие панели инструментов с помощью вкладок, сворачивание панели инструментов только тогда, когда вкладки достигают панели инструментов в андроиде Android – перенаправление на сохранение, если приложение не установлено (запуск с веб-сайта) Ссылка на веб-страницу для открытия приложения instagram Можно ли выбрать конкретный эмулятор устройств Android из AVD с помощью Apache Cordova? Как я должен кодировать, чтобы противостоять «одноразовому пиратству»? Одновременные переводы на Android Android fitsSystemWindows не работает при замене фрагментов Как перезагрузить вкладку при изменении вкладки? Сохранить файл с помощью двоичной строки на Android через HTML5 Изменение цвета выбранных дат в виджетах CalendarView android Почему мой StringRequest всегда работает с методом onErrorResponse?

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); 

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

Solutions Collecting From Web of "PointerIndex вне диапазона Android multitouch"

Моя проблема заключалась в том, что на самом деле он вызывал 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); 

У меня также есть эта ошибка, но ни одно из решений до даты моего сообщения не работает. Единственное временное псевдо-исправление, которое работает для меня, – это использование try-catch против 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); 

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

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