ViewPager を 1 本の指を使用したときにのみスライドさせたい。そこで、クラスを拡張して 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_DOWN を処理せずに ACTION_UP イベントを処理してしまうことです。そこで、この修正を思いつきました。これにより、例外が回避され、2 本目の指を置いたときに 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;
}