12

私は Android 開発の初心者で、Scroller ウィジェット (android.widget.Scroller) について少し知りたいだけです。ビューをどのようにアニメーション化しますか? Animation オブジェクトが存在する場合、アクセスできますか? もしそうなら、どのように?ソース コードを読みましたが、手がかりが見つかりませんでした。

Scroller がスクロールを終了した後に、いくつかの操作を実行したかっただけです。

m_scroller.getAnimation().setAnimationListener(...);
4

4 に答える 4

40

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 の使用の詳細は似ているはずです。

于 2011-06-02T19:28:22.497 に答える
2

上記の素晴らしい答え。Scroller#startScroll(...) は確かに同じように機能します。

たとえば、カスタム スクロール TextView のソース: http://bear-polka.blogspot.com/2009/01/scrolltextview-scrolling-textview-for.html

TextView#setScroller(Scroller) を使用して、TextView に Scroller を設定します。

SDK の TextView のソース: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/TextView.java#TextView .0mScroller

TextView#setScroller(Scroller) が、Scroller#scrollTo(int, int, int, int) が呼び出される、bringPointIntoView(int) のような状況で使用されるクラス フィールドを設定することを示します。

BringPointIntoView() は mScrollX と mScrollY を調整し (いくつかの SDK 断片化コードを使用)、invalidate() を呼び出します。このすべてのポイントは、mScrollX と mScrollY が onPreDraw(...) のようなメソッドで使用され、ビューの描画されたコンテンツの位置に影響を与えることです。

于 2012-02-07T01:04:14.720 に答える