ViewPager与OnPageChangeListener

1.onPageSelectedonPageScrollStateChanged

  • 正常的滑动:
    手指滑动一段距离离开屏幕,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.onPageSelectedonPageScrollStateChangedonPageScrolled

  • 正常的滑动:
    手指滑动一段距离离开屏幕,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,则偏移量渐渐变小

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容