首页 文章

Android Scroller投入固定位置

提问于
浏览
5

我正在尝试使用Scroller进入固定位置 . 我的问题是:它最终处于正确的位置,但它只是运行一次并立即设置结束位置或首先非常慢地滚动然后跳到结尾 .

EDIT: 问题似乎是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);
        }
    }
}

1 回答

  • 2

    好的,我明白了 . 实际上我必须延长我的持续时间(但是文档有点误导 - 它不是添加到当前计算持续时间的值,而是实际的新持续时间) .

    在阅读了更多文档后,我意识到所需的速度确实是每秒的像素,我实际上已经定义了VelocityTracker来使用这个单元 .

    所以这是缺失的一行:

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

相关问题