Scroller ウィジェットは、実際にはほとんど作業を行いません。コールバックを起動せず、何もアニメーション化せず、さまざまなメソッド呼び出しに応答するだけです。
それで、それは何が良いですか?まあ、それは便利なあなたのためのフリングなどのすべての計算を行います。したがって、一般的に行うことは、Scroller に繰り返し「スクロール位置はどうあるべきか? フリングはもう終わった?」と尋ねる Runnable を作成することです。次に、フリングが完了するまで、そのランナブルをハンドラー (通常はビュー) に再投稿します。
これは、私が現在取り組んでいる Fragment の例です。
private class Flinger implements Runnable {
private final Scroller scroller;
private int lastX = 0;
Flinger() {
scroller = new Scroller(getActivity());
}
void start(int initialVelocity) {
int initialX = scrollingView.getScrollX();
int maxX = Integer.MAX_VALUE; // or some appropriate max value in your code
scroller.fling(initialX, 0, initialVelocity, 0, 0, maxX, 0, 10);
Log.i(TAG, "starting fling at " + initialX + ", velocity is " + initialVelocity + "");
lastX = initialX;
getView().post(this);
}
public void run() {
if (scroller.isFinished()) {
Log.i(TAG, "scroller is finished, done with fling");
return;
}
boolean more = scroller.computeScrollOffset();
int x = scroller.getCurrX();
int diff = lastX - x;
if (diff != 0) {
scrollingView.scrollBy(diff, 0);
lastX = x;
}
if (more) {
getView().post(this);
}
}
boolean isFlinging() {
return !scroller.isFinished();
}
void forceFinished() {
if (!scroller.isFinished()) {
scroller.forceFinished(true);
}
}
}
Scroller.startScroll の使用の詳細は似ているはずです。