Android 自定义视图多点触控崩溃

Android 自定义视图多点触控崩溃,android,view,Android,View,当我对自定义视图进行多任务处理时,会发生崩溃: 11-12 21:54:23.048: W/System.err(9625): java.lang.ArrayIndexOutOfBoundsException 11-12 21:54:23.048: W/System.err(9625): at android.view.MotionEvent.getX(MotionEvent.java:972) 11-12 21:54:23.048: W/System.err(9625): at

当我对自定义视图进行多任务处理时,会发生崩溃:

11-12 21:54:23.048: W/System.err(9625): java.lang.ArrayIndexOutOfBoundsException
11-12 21:54:23.048: W/System.err(9625):     at android.view.MotionEvent.getX(MotionEvent.java:972)
11-12 21:54:23.048: W/System.err(9625):     at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
11-12 21:54:23.048: W/System.err(9625):     at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91)
11-12 21:54:23.048: W/System.err(9625):     at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219)
11-12 21:54:23.048: W/System.err(9625):     at com.ex.app.views.PulledItem.determineDrag(PulledItem.java:399)
11-12 21:54:23.048: W/System.err(9625):     at com.ex.app.views.PulledItem.onInterceptTouchEvent(PulledItem.java:290)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:960)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1015)
11-12 21:54:23.048: W/System.err(9625):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1820)
11-12 21:54:23.048: W/System.err(9625):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1176)
11-12 21:54:23.058: W/System.err(9625):     at android.app.Activity.dispatchTouchEvent(Activity.java:2198)
11-12 21:54:23.058: W/System.err(9625):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1795)
11-12 21:54:23.058: W/System.err(9625):     at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2336)
11-12 21:54:23.058: W/System.err(9625):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1976)
11-12 21:54:23.058: W/System.err(9625):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 21:54:23.058: W/System.err(9625):     at android.os.Looper.loop(Looper.java:150)
11-12 21:54:23.058: W/System.err(9625):     at android.app.ActivityThread.main(ActivityThread.java:4277)
11-12 21:54:23.058: W/System.err(9625):     at java.lang.reflect.Method.invokeNative(Native Method)
11-12 21:54:23.058: W/System.err(9625):     at java.lang.reflect.Method.invoke(Method.java:507)
11-12 21:54:23.058: W/System.err(9625):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
11-12 21:54:23.058: W/System.err(9625):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
11-12 21:54:23.058: W/System.err(9625):     at dalvik.system.NativeStart.main(Native Method)
它出现在
getX

private void determineDrag(final MotionEvent event) {
        final int activePointerId = mActivePointerId;
        final int pointerIndex = getPointerIndex(event, activePointerId);
        if (activePointerId == -1)
            return;
        float x;
        float dx;
        float xDiff;
        float y;
        try {
            x = MotionEventCompat.getX(event, pointerIndex);
            dx = x - mInitMotionX;
            xDiff = Math.abs(dx);
            y = MotionEventCompat.getY(event, pointerIndex);
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }

Try catch是解决方案,但我想知道这是Android bug还是其他什么?

这似乎是Android bug是的。在某些情况下,支持库可能没有进行良好(或任何)边界检查

基本上,您会在
onTouchEvent()
onInterceptTouchEvent()
中随机/很少崩溃,或者出现
java.lang.IllegalArgumentException:pointerIndex超出范围
(错误报告)或
java.lang.ArrayIndexOutOfBoundsException
(错误报告)这似乎表现在人们多点触摸时。很难复制

这个问题(以及类似问题)的解决方法似乎是如此子类化,并覆盖
onTouchEvent()
onInterceptTouchEvent()
,在这里您捕获这些异常并返回
false
。参见代码示例