1.onPageSelected與onPageScrollStateChanged
正常的滑動:
手指滑動一段距離離開屏幕,ViewPager自動將當前選中頁面滑動到位
state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
state:ViewPager.SCROLL_STATE_SETTLING//手指離開屏幕
onPageSelected//選中
state:ViewPager.SCROLL_STATE_IDLE//停止滑動不正常的滑動:
手指一直按住屏幕把選中頁面滑動到位,然后手指離開屏幕
state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
state:ViewPager.SCROLL_STATE_IDLE//停止滑動
onPageSelected//選中
2.onPageSelected、onPageScrollStateChanged與onPageScrolled
正常的滑動:
手指滑動一段距離離開屏幕,ViewPager自動將當前選中頁面滑動到位
state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
onPageScrolled//手指觸屏滾動中
...
onPageScrolled//手指觸屏滾動中
state:ViewPager.SCROLL_STATE_SETTLING//手指離開屏幕
onPageSelected//選中
onPageScrolled//自動滾動中
...
onPageScrolled//自動滾動中
state:ViewPager.SCROLL_STATE_IDLE//停止滑動不正常的滑動:
手指一直按住屏幕把選中頁面滑動到位,然后手指離開屏幕
state:ViewPager.SCROLL_STATE_DRAGGING//手指觸摸屏幕
onPageScrolled//手指觸屏滾動中
...
onPageScrolled//手指觸屏滾動中
state:ViewPager.SCROLL_STATE_IDLE//停止滑動
onPageSelected//選中
-
從以上可以看到,正常的滑動時在手指離開屏幕時ViewPager觸發(fā)SCROLL_STATE_SETTLING,并執(zhí)行onPageSelected,然后繼續(xù)自動滾動直到停止;不正常的滑動,手指離開屏幕時沒有觸發(fā)SCROLL_STATE_SETTLING 狀態(tài)變化,而是觸發(fā)了SCROLL_STATE_IDLE,也就是屏幕停止滑動后執(zhí)行的onPageSelected,這之后,沒有onPageScrolled執(zhí)行。 因此在如果要在onPageScrolled中正確獲取onPageSelected(position)方法中的
currentPosition的話,可以在onPageSelected(position)中判斷滾動狀態(tài),如果仍在滾動中,則執(zhí)行一次onPageScrolled。
實例代碼
private boolean isDragging = false;
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_IDLE://停止
break;
case ViewPager.SCROLL_STATE_DRAGGING://down
isDragging = true;
break;
case ViewPager.SCROLL_STATE_SETTLING://up
isDragging = false;
break;
}
}
int currentPosition;
@Override
public void onPageSelected(int position) {
currentPosition = position;
if (isDragging) {
isDragging = false;
onPageScrolled(position, 0, 0);
}
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(!isDragging) {
Log.i(TAG, "onPageScrolled: :" +currentPosition);
}
}
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
三個參數(shù):
position:是滑出與滑入的2個pager中的左側一個!
positionOffset:偏移量,比例
positionOffsetPixels:偏移量,像素
滑動時,如果是向右,例如1—>2,則偏移量漸漸變大;如果是向左滑動,例如2—>1,則偏移量漸漸變小