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)
您的 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 步骤,并且其中的错误从未发生过。
| 归档时间: |
|
| 查看次数: |
2623 次 |
| 最近记录: |