不正确的指针计数 onInterceptTouchEvent

dir*_*ion 5 android android-viewpager

我希望我的 ViewPager 仅在使用单指时滑动。所以我扩展了这个类并像这样实现了 onInterceptTouchEvent:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
    if(ev.getPointerCount() > 1)
    {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

但是无论屏幕上有多少个点,getPointerCount() 总是返回“1”。当我覆盖 onTouchEvent 时,我得到了正确的数字,但是当我这样做时,一个错误通过抛出来阻止寻呼机工作(http://code.google.com/p/android/issues/detail?id=18990)当您将食指从多点触控中抬起时出现应用程序终止异常:java.lang.IllegalArgumentException:pointerIndex out of range

我还能怎么做?

编辑:

指针计数问题仍然存在,但我能够解决在 onTouchEvent 中引发的异常。

当我得到异常时,我正在这样做:

if(ev.getPointerCount() == 1)
{
    return super.onTouchEvent(ev);
}
return false;
Run Code Online (Sandbox Code Playgroud)

问题在于,当您从多点触控中抬起食指时,ViewPager 的 onTouchEvent 最终会处理 ACTION_UP 事件,而不会先处理 ACTION_DOWN。所以我想出了这个修复,它避免了异常,并且当你放下第二根手指时会结束 ViewPager 的移动:

private boolean moving = false;
@Override
public boolean onTouchEvent (MotionEvent ev)
{
    int action = ev.getAction();
    if(action == MotionEvent.ACTION_DOWN)
    {
        moving = true;
    }
    if(ev.getPointerCount() == 1)
    {
        if(moving)
        {
            return super.onTouchEvent(ev);
        }

        if(action == MotionEvent.ACTION_UP)
        {
            moving = false;
        }
    }
    else if(ev.getPointerCount() > 1 && moving)
    {
        ev.setAction(MotionEvent.ACTION_UP);
        moving = false;
        return super.onTouchEvent(ev);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

gor*_*ncy 5

您的 onTouchEvent 对我不起作用。我会调查原因。但与此同时,我做了另一个解决方法。我深入研究了 ViewPager 代码,发现您可以这样做:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    if (ev.getPointerCount() > 1){
        ev.setAction(MotionEvent.ACTION_CANCEL);
    }

    return super.onInterceptTouchEvent(ev);

}
Run Code Online (Sandbox Code Playgroud)

getPointerCount() 对我来说还可以。使用上面的代码,ViewPager 也处理了 ACTION_DOWN 步骤,并且其中的错误从未发生过。