我正在尝试使用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);
}
}
}
答案 0 :(得分:2)
好的,我明白了。实际上我必须延长我的持续时间(但是文档有点误导 - 它不是当前计算的持续时间中添加的值,而是实际的新持续时间)。
在阅读了更多文档之后,我意识到所需的速度确实是每秒的像素数,而我实际上已经定义了VelocityTracker来使用这个单元。
所以这是缺失的一行:
scroller.extendDuration((int)(Math.abs(offsetX)/(float) Math.max(1000,Math.abs(initialVelocity))* 1000));