Android Scroller将滑动惯性移动到固定位置

5
我正在尝试使用滚动条(fling Scroller)滚动到固定位置。我的问题是:它最终会在正确的位置,但要么只运行一次并立即设置结束位置,要么先缓慢滚动然后跳到末尾。
编辑: 问题似乎是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);
        }
    }
}

你是如何计算速度的?同时,你是否在用户交互(例如触摸移动)时执行滚动功能? - Triode
你是如何计算速度的?还有,你是在用户交互中实现滚动功能的吗?如果是这样,为什么不使用类似以下代码的方式实现:final int delta = newX - getScrollX(); mScroller.startScroll(getScrollX(), 0, delta, 0,Math.abs(delta)); 其中,newX 是当前鼠标抬起位置。你也可以使用 velocity tracker 来检查触摸移动的速度。 - Triode
是的,我正在使用VelocityTracker,但我已经找出了问题所在(请参见下面的答案)。谢谢! - Maria Neumayer
1个回答

2

好的我明白了。实际上,我需要延长我的时间(然而文档有点误导——它不是将当前计算的持续时间增加的值,而是实际的新持续时间)。

在阅读更多文档后,我意识到所需的速度确实是每秒像素数,并且我实际上已经定义了VelocityTracker来使用此单位。

所以这是缺失的行:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接