• 在页面滑动时会回调ViewPager.OnPageChangeListener接口里的方法. 用ViewPage.addOnPageChangeListener添加和ViewPage.removeOnPageChangeListener删除监听回调方法. 如果不想实现所有方法, ViewPager内有个空的类SimpleOnPageChangeListener实现了这个接口, 继承这个类便可. 注意可以多次调用addOnPageChangeListener方法添加多个回调, ViewPager按添加顺序进行调用, 所以在不需要回调时, 及时的使用removeOnPageChangeListener来删除回调方法. 另外还需要注意的是ViewPager.getCurrentItem返回值和OnPageSelected参数是一样的, 即是成功滑动后的目标页面索引, 无论当前页面是否还在滑动中

    1. 在滑动的时候会调用OnPageScrolled(int position, float positionOffset, int positionOffsetPixels)

      • 参数position指的是在滑动时当前显示页面左边页面的位置, 具体来说是

      i.向右滑动时, position的值为当前页面的值, 如果滑动成功(即滑动到右一页面), OnPageScrolled会被再一次调用, 此时position的值为滑动成功后的页面position+1, 如果滑动失败, position依然不变

       从 `0`滑动`1`时, 滑动时`position`是`0`, 滑动成功后`OnPageScrolled`会再被调用一次且`position`会变成`1`, 滑动失败`position`依然为`0`, 这跟向左滑动有区别, 需要注意
      

      ii.向左滑动时, position的值为滑动的目标页面, 滑动成功后, 不会再次调用OnPageScrolled. 如果滑动失败, 最后一次会再次调用OnPageScrolled, 此时position为原先页面.

      ​ 从1滑动到0时, position的值为0, 成功滑动到页面1后也不会再次调用该方法, 这个有区别于向右滑动. 然而如果滑动失败, 则会再一次调用该方法, 此时position的值为1

      • 参数positionOffset指的是滑动时, indexposition + 1的页面占显示窗口(ViewPager)的百分比, 其取值为[0, 1), 当值为0时, 页面停止滑动.

      i. 向右滑动时, positionOffset0变大到接近1(不包含), 最后变成0(滑动停止时)

      ii. 向左滑动时, positionOffset1(不包含)变小到0(当为0时已经停止滑动)

      • positionOffsetPixels指的是滑动像素值, 情况和positionOffset是一致的.

      i. 向右滑动, positionOffsetPixels一直增大到和显示窗口(ViewPager)一样, 滑动停止时变为0

      ii. 向左滑动, positionOffsetPixels从窗口大小一直减小到0

    2. OnPageSelected(int position)

      该方法会在滑动成功时立即被调用, 滑动成功的意思指手指在滑动页面足够长的距离后, 手指离开屏幕的一瞬间, 屏幕会自行滑动到目标页面即为滑动成功; 如果距离不够, 页面会回弹, 即为滑动失败. OnPageSelected会在滑动成功的瞬间立即被调用, 无论当前页面是否还在滑动中. position指的是目标页面的索引值. 注意OnPageSelected在调用时, OnPageScrolled可能会还在继续被调用中

    3. OnPageScrollStateChanged(int state)

      该方法在页面状态有改变时会调用, state指当前页面的状态, 一共有三个状态.

      i. ViewPager.SCROLL_STATE_DRAGGING 页面在拖拽, 值为1

      ii. ViewPager.SCROLL_STATE_SETTLING 手指离开屏幕, 页面正滑向目标页面, 值为2

      iii. ViewPager.SCROLL_STATE_IDLE 页面空闲中, 无任何滑动拖拽动画, 值为0

      页面的状态总是会经历1, 2, 0的顺序状态, 手指按到屏幕时, 状态为1, 手指离开屏幕时, 状态为2, 页面无任何动画时, 状态为0

Reference:
  1. http://dalufan.com/2015/09/08/android-setOnPageChangeListener/