ViewPager如何區分自動切換和手勢滑動切換

ViewPager是一個很常見的組件,不僅支持收拾滑動切換頁面,我們還可以通過viewPager.setCurrentItem(index)來切換到指定的頁面,那麼他們如何區分呢?

我們知道ViewPager可以添加ViewPager.OnPageChangeListener監聽器,可以監聽切換的狀態。通過觀察ViewPager.OnPageChangeListener#onPageScrollStateChanged(int state)方法中state的輸出,發現了手勢切換和自動切換的規律,具體規律如下:

手勢滑動翻頁的log:

OnPageChangeListener onPageScrollStateChanged state:1
OnPageChangeListener onPageScrollStateChanged state:2
OnPageChangeListener onPageSelected position:1
OnPageChangeListener onPageScrollStateChanged state:0

代碼翻頁的log:

OnPageChangeListener onPageScrollStateChanged state:2
OnPageChangeListener onPageSelected position:9
OnPageChangeListener onPageScrollStateChanged state:0

根據log可以得出如下結論:

手勢滑動翻頁,是1、2、0(ViewPager.SCROLL_STATE_DRAGGING、ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
代碼翻頁,是2、0(ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)

根據這個規律,我們可以寫出以下代碼:我們在onPageScrollStateChanged判斷是否是手動的狀態,並且可以在onPageSelected方法中使用這個狀態。

/**
 * 是否是用戶手動切換ViewPager
 */
private boolean manualDraging = false;

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        LogUtils.e(TAG, "OnPageChangeListener onPageScrolled:" + position);
    }

    @Override
    public void onPageSelected(int position) {
        // 如果是手動模式,就暫停播放,同時清除掉各種狀態;
        if (manualDraging) {
            LogUtils.e(TAG, "手動切換");
        } else {
            LogUtils.e(TAG, "代碼切換");
        }
    }


    @Override
    /**
     * 代碼翻頁,是2、0(ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
     * 手動滑動翻頁,是1、2、0(ViewPager.SCROLL_STATE_DRAGGING、ViewPager.SCROLL_STATE_SETTLING、ViewPager.SCROLL_STATE_IDLE)
     * {@link ViewPager.SCROLL_STATE_IDLE}
     * {@link ViewPager.SCROLL_STATE_DRAGGING}
     * {@link ViewPager.SCROLL_STATE_SETTLING}
     */
    public void onPageScrollStateChanged(int state) {
        LogUtils.e(TAG, "OnPageChangeListener onPageScrollStateChanged state:" + state);
        switch (state) {
            case ViewPager.SCROLL_STATE_IDLE:
                manualDraging = false;
                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                manualDraging = true;
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                break;
            default:
                break;
        }
    }
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章