Android多点触控时出现pointerIndex out of range 的错误分析
关于多点触控时出现pointerIndex out of range这个问题在网上查了好多资料,有以下几种情况:
-
1.Android自身的问题,需要重新编译代码:这个没有验证过;
-
2.将返回结果改为return false; :这是一个老外写的解决方法,本来以为能解决问题,结果....呵呵了,连单点的拖动都不能用了-.-!!
-
3.没有处理异常:IllegalArgumentException
这个靠点谱,因为控制台确实也报了这个错误,但一般文章都只贴了try{}catch代码,没写为什么,试了好多次,“一拖动”图片没了!
下面是具体的报错日志:
E/CrashReport: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(Native Method)
at android.view.MotionEvent.getX(MotionEvent.java:2080)
at androidx.viewpager.widget.ViewPager.onInterceptTouchEvent(ViewPager.java:2072)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2120)
这个问题通过重写viewpager 然后try()catch onInterceptTouchEvent()
的内容就可以解决
问题分析
这个问题的这个准确的位置是在event.getX(int)和event.getY(int)中会报错,因为你的触控点(那个int参数)可能越界了!我的问题是在两点触控后,有一个手指抬起的时候出现的,发现问题了没有!!!!当两点触控后抬起一个手指的时候只有一个触控点了,通过event.getX(1)的时候就越界了!所以只是try{}catch{}是可以解决问题,但是没解决根本问题的。
这个问题的根本在于判断动作的时候可能没有做好case:MotionEvent.ACTION_POINTER_UP这个动作的处理,或没有调用super.onInterceptTouchEvent导致没有对pointerIndex 进行重新赋值。这个动作是在多点触控后,抬起部分手指(还有手指在屏幕上)的时候触发的。
问题解决
1.处理好case:MotionEvent.ACTION_POINTER_UP的操作
2.调用 super.onInterceptTouchEvent();更新poinerIndex状态
3.重写报错的viewGroup 并try{}catch会出错的onIntercepterTouchevent()方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
try {
return super.onInterceptTouchEvent(ev);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
}
return false;
}