我希望我的 ViewPager 仅在使用单指时滑动。所以我扩展了这个类并像这样实现了 onInterceptTouchEvent:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
if(ev.getPointerCount() > 1)
{
return false;
}
return true;
}
但无论屏幕上有多少点,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;
问题在于,当您从多点触控中抬起第一根手指时,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;
}