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;
}
}
});