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の説明

http://developer.android.com/reference/android/support/v4/view/ViewPager.SimpleOnPageChangeListener.html

onPageScrollStateChanged(int state)

ページスクロール状態が通知される。

【引数】

  • state : ページスクロール状態
SCROLL_STATE_IDLE
初期状態。ページスクロール完了後に通知される。
SCROLL_STATE_DRAGGING
ドラッグ開始時に通知される。SCROLL_STATE_DRAGGING が通知されると、onPageScrolled の通知が開始される。
SCROLL_STATE_SETTLING
ドラッグ終了時に通知される。ドラッグした移動量に応じて、移動先のページ(前のページ、現在のページ、次のページ)が決定され、onPageSelected に移動先のページが通知される。

f:id:incesticide:20140503132507p:plain

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のキャッシュする画面数を変更する方法についての記事。