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