Android多点触控时出现pointerIndex out of range 的错误分析

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

你可能感兴趣的:(Android多点触控时出现pointerIndex out of range 的错误分析)