ViewPagerのイベントをハンドルする(ページ移動)
検証
ViewPager.SimpleOnPageChangeListener を継承したコードを書いて、動作を検証する。
mViewPager.setOnPageChangeListener(
new MyOnPageChangeListener());
private class MyOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener { private static final String TAG = "OnPageChangeListener"; @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_IDLE: Log.d(TAG, "onPageScrollStateChanged" + " state: SCROLL_STATE_IDLE"); break; case ViewPager.SCROLL_STATE_SETTLING: Log.d(TAG, "onPageScrollStateChanged" + " state: SCROLL_STATE_SETTLING"); break; case ViewPager.SCROLL_STATE_DRAGGING: Log.d(TAG, "onPageScrollStateChanged" + " state: SCROLL_STATE_DRAGGING"); break; default: Log.d(TAG, "onPageScrollStateChanged" + " state: default"); break; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { Log.d(TAG, "onPageScrolled" + " position: " + position + ", positionOffset: " + positionOffset + ", positionOffsetPixels: " + positionOffsetPixels); } @Override public void onPageSelected(int position) { Log.d(TAG, "onPageSelected" + " position: " + position); } }
実行結果(logcat)
D/OnPageChangeListener( 4203): onPageScrollStateChanged state: SCROLL_STATE_DRAGGING
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.075, positionOffsetPixels: 54
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.33194444, positionOffsetPixels: 239
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.44027779, positionOffsetPixels: 317
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.5347222, positionOffsetPixels: 385
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.6097222, positionOffsetPixels: 438
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.6944444, positionOffsetPixels: 499
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.7722222, positionOffsetPixels: 556
D/OnPageChangeListener( 4203): onPageScrollStateChanged state: SCROLL_STATE_SETTLING
D/OnPageChangeListener( 4203): onPageSelected position: 1
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.78333336, positionOffsetPixels: 564
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.8375, positionOffsetPixels: 603
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.87222224, positionOffsetPixels: 628
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9097222, positionOffsetPixels: 655
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.93472224, positionOffsetPixels: 673
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.95, positionOffsetPixels: 684
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9652778, positionOffsetPixels: 695
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9763889, positionOffsetPixels: 703
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9847222, positionOffsetPixels: 709
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9916667, positionOffsetPixels: 714
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.99444443, positionOffsetPixels: 716
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.99722224, positionOffsetPixels: 718
D/OnPageChangeListener( 4203): onPageScrolled position: 0, positionOffset: 0.9986111, positionOffsetPixels: 719
D/OnPageChangeListener( 4203): onPageScrolled position: 1, positionOffset: 0.0, positionOffsetPixels: 0
D/OnPageChangeListener( 4203): onPageScrollStateChanged state: SCROLL_STATE_IDLE
ViewPager.SimpleOnPageChangeListenerの説明
onPageScrollStateChanged(int state)
ページスクロール状態が通知される。
【引数】
- state : ページスクロール状態
- SCROLL_STATE_IDLE
- 初期状態。ページスクロール完了後に通知される。
- SCROLL_STATE_DRAGGING
- ドラッグ開始時に通知される。SCROLL_STATE_DRAGGING が通知されると、onPageScrolled の通知が開始される。
- SCROLL_STATE_SETTLING
- ドラッグ終了時に通知される。ドラッグした移動量に応じて、移動先のページ(前のページ、現在のページ、次のページ)が決定され、onPageSelected に移動先のページが通知される。
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
ページスクロール中に通知される。
【引数】
- position : スクロール中のページ。position+1になると、positionOffsetが0になる。
- positionOffset : ドラッグ量。0以上1未満の数値。
- positionOffsetPixels : ドラッグ量のピクセル数。
onPageSelected(int position)
移動先のページ(前のページ、現在のページ、次のページ)が決定された時に通知される。つまり、ドラッグ終了し、SCROLL_STATE_SETTLING が通知される契機であり、ページスクロールが完了した時ではないことに注意。
【引数】
- position : 移動先のページ
まとめ
private class MyOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener { private static final String TAG = "OnPageChangeListener"; @Override public void onPageScrollStateChanged(int state) { switch (state) { case ViewPager.SCROLL_STATE_IDLE: // ページの移動完了時 break; case ViewPager.SCROLL_STATE_SETTLING: // ドラッグ終了時 break; case ViewPager.SCROLL_STATE_DRAGGING: // ドラッグ開始時 break; default: break; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // ドラッグ中 } @Override public void onPageSelected(int position) { // ドラッグ終了時(移動先のページ決定時) }
ページの移動開始とページの移動完了を検出するには?
- ページの移動開始
- onPageScrollStateChanged の state が SCROLL_STATE_DRAGGING の時
- ページの移動完了
- onPageScrollStateChanged の state が SCROLL_STATE_IDLE の時
参考
リファレンス
ページ切り替えのイベントについてわかりやすく解説されています。
関連記事
ViewPager のアニメーションについてまとめた記事。
ViewPagerのキャッシュする画面数を変更する方法についての記事。