【Android】リストビューの自動スクロール機能を実装する


長い記事や掲示板を読むようなアプリに、ユーザーが手を離していても自動でスクロールできる機能をあれば便利だ。というわけで今回は、ListViewをコンポジットして自動スクロールさせるクラスを実装する。

AutoScroller.java

コードはかなり短い。

📄AutoScroller.java
import android.os.Handler;
import android.widget.AbsListView;

public class AutoScroller {

    private static final int DEFAULT_SCROLL_BY = 5;
    private static final int DURATION = 50;

    private final AbsListView scrollView;
    private final int scrollBy;

    public AutoScroller(AbsListView scrollView) {
        this(scrollView, DEFAULT_SCROLL_BY);
    }

    public AutoScroller(AbsListView scrollView, int scrollBy) {
        this.scrollView = scrollView;
        this.scrollBy = scrollBy;
    }

    private final Handler autoScrollHandler = new Handler();

    private final Runnable autoScrollRunnable = new Runnable() {
        @Override
        public void run() {
            scrollView.smoothScrollBy(scrollBy, DURATION);
            autoScrollHandler.postDelayed(this, DURATION);
        }
    };

    public void start() {
        autoScrollHandler.postDelayed(autoScrollRunnable, DURATION);
    }

    public void stop() {
        autoScrollHandler.removeCallbacksAndMessages(null);
    }
}

Handlerを使用して、スクロール処理を定期的に実行しつづけている。

呼び出し側は次のような感じになる。

📄xxx.java
autoScroller = new AutoScroller(listView);
autoScroller.start();

スピードを変更する場合はコンストラクタでscrollByを指定すればよい。大きくすれば速くなる。またDURATIONを変更すれば実行間隔を変更できる。色々試したみた結果、50msぐらいだとスムーズにスクロールする。ただこのあたりは端末のパワーにも依存するのかもしれない。

なお、然るべきタイミングでstop()を呼び出すのを忘れないように。基本的には、ActivityやFragmentのonPauseあたりで呼び出すことになるのかな。

関連する記事


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください