5

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;
}
4

2 に答える 2

5

あなたの onTouchEvent は私にとってはうまくいきませんでした。その理由を調べます。しかし、その間に別の回避策を実行しました。ViewPager コードを掘り下げたところ、代わりにそれを実行できることがわかりました。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

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

    return super.onInterceptTouchEvent(ev);

}

getPointerCount() は私にとってはうまくいきます。上記のコードでは、ViewPager は ACTION_DOWN ステップも処理し、バグは発生しません。

于 2013-01-24T05:57:45.833 に答える