長い記事や掲示板を読むようなアプリに、ユーザーが手を離していても自動でスクロールできる機能をあれば便利だ。というわけで今回は、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
あたりで呼び出すことになるのかな。
関連する記事
- 【Android】フリックイベントを実装する
- Android StudioからAndroid-PullToRefreshを使用する
- 【Android】10回に1回インタースティシャル広告を表示する
- 【Flutter】表示中のアイテムを取得できたり任意のindexにスクロールできたりするListView
- ViewPager + TabLayout + AdMob コード例