本文主要说Android多点触控时出现pointerIndex out of range 的错误分析
Android多点触控时出现pointerIndex out of range 的错误分析
关于多点触控时出现pointerIndex out of range这个问题在网上查了好多资料,有以下几种情况:
1.Android自身的问题,需要重新编译代码:这个没有验证过;
2.将返回结果改为return false; :这是一个老外写的解决方法,本来以为能解决问题,结果….呵呵了,连单点的拖动都不能用了-.-!!
3.没有处理异常:IllegalArgumentException
这个靠点谱,因为控制台确实也报了这个错误,但一般文章都只贴了try{}catch代码,没写为什么,试了好多次,“一拖动”图片没了!
下面是具体的报错日志:
1 | E/CrashReport: java.lang.IllegalArgumentException: pointerIndex out of range |
这个问题通过重写viewpager 然后try()catch 1
2
3
4
5
6
7
8### 问题分析
##### 这个问题的这个准确的位置是在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;
}`