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 h
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);
Just change your getPointerId()
to findPointerIndex()
. Maybe change geAction()
to getActionMasked()
.
Hope it helps!
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);
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!
For those who are still looking for answers please note that this may happen also when you are using any ViewPager with some Zooming or Scaling features on image etc inside it. Then there is a possibility you can get this Exception as well.
Solution:
Extend the existing ViewPager and override these methods with try catch.
@Override
public boolean onTouchEvent(MotionEvent ev) {
try {
return super.onTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}
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.