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触发SCROLL_STATE_SETTLING,并执行onPageSelected,然后继续自动滚动直到停止;不正常的滑动,手指离开屏幕时没有触发SCROLL_STATE_SETTLING 状态变化,而是触发了SCROLL_STATE_IDLE,也就是屏幕停止滑动后执行的onPageSelected,这之后,没有onPageScrolled执行。 因此在如果要在onPageScrolled中正确获取onPageSelected(position)方法中的
currentPosition
的话,可以在onPageSelected(position)中判断滚动状态,如果仍在滚动中,则执行一次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)
三个参数:
position:是滑出与滑入的2个pager中的左侧一个!
positionOffset:偏移量,比例
positionOffsetPixels:偏移量,像素
滑动时,如果是向右,例如1—>2,则偏移量渐渐变大;如果是向左滑动,例如2—>1,则偏移量渐渐变小