5

スクローラーを使って固定位置に飛ばそうとしています。私の問題は、それが正しい位置になってしまうことですが、一度実行してすぐに終了位置を設定するか、最初に非常にゆっくりとスクロールしてから最後にジャンプします。

編集:問題は、a)私の速度が時々ゼロになること(それはどこか別の場所で問題です:))であり、を使用して期間を延長する必要があることのようscroller.extendDuration()です。しかし、私は期間がどうあるべきかについて確信がありません。特定の速度が実際に何を意味するのかについての情報を見つけることができません。毎秒ピクセルですか?

これが私のコードです:

private class Flinger implements Runnable {

    private final Scroller scroller;

    private int lastX = 0;

    public Flinger() {
        scroller = new Scroller(getContext());
    }

    void startFling(int initialVelocity, int offsetX) {
        Log.d("test", "finalX = " + offsetX);
        if (offsetX > 0) {
            scroller.fling(0, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0);
            scroller.setFinalX(offsetX);
            lastX = 0;
        } else {
            scroller.fling(getWidth(), 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0);
            scroller.setFinalX(getWidth() + offsetX);
            lastX = getWidth();
        }
        post(this);
    }

    @Override
    public void run() {
        if (scroller.isFinished()) {
            Log.d("test", "scroller finished");
            return;
        }

        boolean more = scroller.computeScrollOffset();
        int x = scroller.getCurrX();
        int diff = lastX - x;
        Log.d("test", "isFlinging, x=" + x + ", diff=" + diff + ", leftOffset=" + getLeftOffset() + ", isDone=" + !more);
        if (diff != 0) {
            setLeftOffset(getLeftOffset() - diff);
            lastX = x;
        }

        if (more) {
            post(this);
        }
    }
}
4

1 に答える 1

2

わかった。実際、期間を延長する必要がありました (ただし、ドキュメントは少し誤解を招く可能性があります。現在の計算された期間に追加される値ではなく、実際の新しい期間です)。

もう少しドキュメントを読んだ後、必要な速度は実際にはピクセル/秒であることに気付き、実際にこの単位を使用するように VelocityTracker を定義しました。

したがって、これは欠落している行です:

scroller.extendDuration((int) (Math.abs(offsetX) / (float) Math.max(1000, Math.abs(initialVelocity)) * 1000));

于 2012-04-12T12:50:59.173 に答える