0

左から右または右から左にスワイプしたときにトリガーされるはずの ListView にカスタム Swipe イベントがあります。きちんと機能していますが、問題があります。スクロールしようとすると自然に発生する Fling イベントが有効になりません (後で説明します)。Fling イベントを手動で再作成するにはどうすればよいですか? 私が使用しているコードは次のとおりです。

スワイプ クラス:

public class Swipe implements SwipeInterface {

public Swipe() {}

@Override
public void bottom2top(View v) {
    //Help!
}

@Override
public void left2right(View v) {
    //Does logic here
}

@Override
public void right2left(View v) {
    //Does logic here
}

@Override
public void top2bottom(View v) {
    //Help!
}

}

カスタム Detector クラス。このクラスは主にスワイプの距離をチェックします。

public class ActivitySwipeDetector implements View.OnTouchListener {

static final String logTag = "ActivitySwipeDetector";
private Swipe swipe;
static final int MIN_DISTANCE = 200;
private float downX, downY, upX, upY;

public ActivitySwipeDetector(Swipe swipe) {
    this.swipe = swipe;
}

public void onRightToLeftSwipe(View v) {
    Log.i(logTag, "RightToLeftSwipe!");
    swipe.right2left(v);
}

public void onLeftToRightSwipe(View v) {
    Log.i(logTag, "LeftToRightSwipe!");
    swipe.left2right(v);
}

public void onTopToBottomSwipe(View v) {
    Log.i(logTag, "onTopToBottomSwipe!");
    swipe.top2bottom(v);
}

public void onBottomToTopSwipe(View v) {
    Log.i(logTag, "onBottomToTopSwipe!");
    swipe.bottom2top(v);
}

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN: {
        downX = event.getX();
        downY = event.getY();
        return true;
    }
    case MotionEvent.ACTION_UP: {
        upX = event.getX();
        upY = event.getY();

        float deltaX = downX - upX;
        float deltaY = downY - upY;

        // swipe horizontal?
        if (Math.abs(deltaX) > MIN_DISTANCE) {
            // left or right
            if (deltaX < 0) {
                this.onLeftToRightSwipe(v);
                return true;
            }
            if (deltaX > 0) {
                this.onRightToLeftSwipe(v);
                return true;
            }
        } else {
            Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
        }

        // swipe vertical?
        if (Math.abs(deltaY) > MIN_DISTANCE) {
            // top or down
            if (deltaY < 0) {
                this.onTopToBottomSwipe(v);
                return true;
            }
            if (deltaY > 0) {
                this.onBottomToTopSwipe(v);
                return true;
            }
        } else {
            Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE);
        }
    }
    }
    return false;
}

}

最後に、カスタム リスナーを実装するために次のようにします。

Swipe swipe = new Swipe();
ActivitySwipeDetector detector = new ActivitySwipeDetector(swipe);
listview.setOnTouchListener(detector);

繰り返しますが、これはうまく機能し、ListView に OnItemClickListener を実装することもできますが、Swipe クラスの bottom2top メソッドと top2bottom メソッドがオーバーライドされているため、「フリング スクロール」は行われなくなりました。問題は、Fling スクロールをもう一度「作成」するにはどうすればよいかということです。私の推測では、「Help!」とラベル付けしたコードを置き換える必要があると思います。何かで、しかし、私は何を見つけることができません。

助けてください?

4

1 に答える 1

1

スワイプ アクションの検出にGestureDetectorを使用しない理由。

于 2013-06-11T08:17:29.520 に答える