美文网首页
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