这周做了一个需求,使用viewpager实现图片的滚动,我的需求是三张图片,要求在滚动时,图片在两两之间有淡入淡出效果,
要想实现这个效果,要在viewpager的滚动监听中操作,首先看一下viewpager的滚动监听函数
OnPageChangeListener这个接口需要实现三个方法:(onPageScrollStateChanged,onPageScrolled ,onPageSelected)
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
}
以上三个方法就是实现viewpager监听器时,必须重写的方法
onPageScrollStateChanged中的arg0参数有三种状态,分别是0,1,2
安照我们滚动的顺序讲解(手指触摸-手指滑动-手指抬起)
当我们手指触摸到viewpager时,不滑动(就是你点击viewpager,OnPagerChangeListener监听器是不会监听你的点击操作的,也就是说你必须做滑动操作,OnPagerChangeListener才会不触发)viewpager的监听器不会触发。
当我们手指触摸到viewpager时,进行了滑动(轻微也是滑动了),参数arg0这时的状态值是1(1表示滑动),当然,当你滑动的时候,viewpager不会停留在这里,随着你的滑动,OnPagerChangeListener会调用 public void onPageScrolled(int arg0, float arg1, int arg2) 这个函数,
arg0:表示当前页面,你是你滑动的页面
arg1:表示你滑动时,当前页面的偏移的百分比
arg2:表示滑动时,当前页面的偏移像素位置
然后,当你手指抬起,这里会有两种情况
1:页面没有切换到下一页,调用 onPageScrollStateChanged(int arg0),其中的arg0的状态值arg0变成了2,这时会再次调用 public void onPageScrolled(int arg0, float arg1, int arg2)然后回到原位,回到原位过程中,调用onPageScrollStateChanged(int arg0)函数,其中的arg0变成了0,表示结束,看到这里想必你已经看出来了,在没有切换到新的页面时,onPageScrollStateChanged(int arg0)点用了3次,对应了3中状态值。
2:页面切换到下一页,调用onPageScrollStateChanged(int arg0),其中的arg0的状态值arg0变成了2,然后紧接着调用了又一个方法 onPageSelected(int arg0) ,这个方法在切换页面成功,才会调用,然后和1情况一样调用public void onPageScrolled(int arg0, float arg1, int arg2),但是区别在于,这有一个过渡过程,因为最后arg0的值,会从当前也面的值(比如 i)变成下一个页面的值(i+1),最后调用onPageScrollStateChanged(int arg0),其中的arg0变成了0,表示结束,看到这里想必你已经看出来了,也调用了3次,所以只要可以滚动,它都会调用3次
还有一种特殊情况,就是你的viewpager就是第一页,而你的viewpager是不带循环滑动的,这时你想不能滑动的方向滑动,这时OnPagerChangeListener之调用onPageScrollStateChanged(int arg0) 中的arg0=1和arg0=0的状态,因为arg0=2表示滑动,页面都没有了,所以不会动的,所以只有两种状态,注意他们两之间还是有onPageSelected(int arg0) 函数的调用的