美文网首页
ViewPager与OnPageChangeListener

ViewPager与OnPageChangeListener

作者: INeil | 来源:发表于2018-07-05 17:26 被阅读61次

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,则偏移量渐渐变小

相关文章

网友评论

      本文标题:ViewPager与OnPageChangeListener

      本文链接:https://www.haomeiwen.com/subject/endeuftx.html