问题
I have a touch event exception that is causing my game to crash on tablets (or more specifically, honeycomb)... My game works fine on my phone and I haven't heard of this happening to anyone that isn't running Android 3.0 or higher. Here is the relevant log info...
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)
... And here is the code that is calling it. Seems fine to me, but maybe there is a bug in honeycomb that hasn't been fixed yet? The line number 665 from the log above corresponds to the float x = event.getX(id);
line. It must have something to do with the way I am getting the which
variable maybe? But it works fine on the phones/2.3 and lower...
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);
Any help/ideas would be greatly appreciated as I am trying to make my game available to tablet users as well. Thanks.
回答1:
My problem was that it was actually calling event.getX(1) when there wasn't actually two ids. So I made sure that there were two ids with event.getPointerCount() >= 2 and it now works. Maybe you'll have the same luck!
回答2:
Your missing a few things, you need to apply the mask to the pointer otherwise as you are not technically accessing the ID of the finger you think you are
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);
回答3:
I'm also having this error but none of the solutions before the date of my post work. The only temporary pseudo-fix which works for me is to use a try-catch against IllegalArgumentException.
According to Android Issue 18990, it is related to ScaleGestureDetector and a fix has been committed few days ago.
回答4:
Just change your getPointerId()
to findPointerIndex()
. Maybe change geAction()
to getActionMasked()
.
Hope it helps!
回答5:
The original posting is using the pointer id when the getX and getY use the pointer index.
It appears to work when you use the ID for a single touch because the id and the index are both 0. It will mess up if you use a multi-touch because the indexes can change.
Example:
Touch 1 Down.
Touch 1 State Index=0. ID=0
Touch 2 Down.
Touch 1 State Index=0. ID=0
Touch 2 State Index=1. ID=1
Touch 1 Release.
Touch 2 State Index=0. ID=1
Try the following code:
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);
来源:https://stackoverflow.com/questions/6919292/pointerindex-out-of-range-android-multitouch