ViewPager 滑动监听

当我们使用ViewPager+Fragment的时候经常会出现滑动的时候一卡一卡的,多半原因是在滑动的过程中同时操作Fragment中的逻辑,所以只需要正确用好 OnPageChangeListener();

@Override
public void onPageSelected(int position) {
    //position只有当页面真正切换的时候,才会调用这个方法,如果页面index一直没有变,则不会调用改方法
    Log.e(TAG,"onPageSelected"+position);
    //我们通常会在这里处理一些逻辑....
    doSomeThing(position);
}

如上图,大部分人都会在onPageSelected()方法中处理相应的逻辑,这样做最大的好处就是,在滑动到下一页前,可以提前预处理好相应逻辑。但是如果这部分逻辑过于复杂,就会造成卡顿(因为滑动和处理逻辑同时进行)。我们可以采取以下方式:

@Override
public void onPageScrollStateChanged(int state) {
    // press:state=1; up:state=2; idle:state=0;
    Log.e(TAG,"onPageScrollStateChanged"+state);
    if(state==0){
        doSomeThing();
    }
}

下面我们就来讲下这几个回调函数的执行顺序和其中的参数意义。

1:onPageScrollStateChanged(int state)

        从名字可以看出这个方法主要用来监测viewpager的滑动状态:当我们手指按下时 state=1,当我们手指抬起时 state=2,当viewpager处于空闲状态时 state=0;所以我们完全可以在state=0时 去加载或者处理我们的事情,因为这时候滑动已经结束。

2:onPageScrolled(int position , float positionOffset ,int positionOffsetPixels);

        这个方法主要是在viewpager滑动过程中执行,并且会被调用很多次。需要注意的是,position的值使用等于屏幕最左侧暴露出来的view的position,即使该view已经快看不见了。 第二个参数positionOffset:从左向右滑动时该值从1---0 变化,从右向左滑动时该值从0---1变化。第三个参数positionOffsetPixels:这个参数是viewpager滑动偏移量的具体值,比如屏幕宽度值是1080px而viewpager的宽度等于屏幕宽度,则这个值就会在0-1080之间变化。

3:onPageSelected(int position)

        这个方法会在viewpager快要成功切换的时候调用。怎么理解这句话呢,当我们滑动距离很小的时候,viewpager会自动回弹到当前页,也就是不进行页面切换,此时该方法不会被调用,因为页面并没有被成功切换;当我们滑动距离很大的时候,viewpager会自动帮我们滑动到下一页,此时手指抬起,viewpager判断即将成功切换到下一页,那么该方法就会被调用,并且position的值等于即将切换过去的页面的下标。

三个方法的执行顺序, onPageScrollStateChanged>onPageScrolled>onPageSelected :下面看下我手指从按下到抬起几个方法的执行情况。

06-13 11:03:38.245 24907-24907/com.example.win10.mytest E/====: onPageScrollStateChanged1
06-13 11:03:38.245 24907-24907/com.example.win10.mytest E/---->: onPageScrolled58
06-13 11:03:38.262 24907-24907/com.example.win10.mytest E/---->: onPageScrolled148
06-13 11:03:38.280 24907-24907/com.example.win10.mytest E/---->: onPageScrolled312
06-13 11:03:38.296 24907-24907/com.example.win10.mytest E/---->: onPageScrolled477
06-13 11:03:38.307 24907-24907/com.example.win10.mytest E/---->: onPageScrolled519
06-13 11:03:38.310 24907-24907/com.example.win10.mytest E/====: onPageScrollStateChanged2
06-13 11:03:38.310 24907-24907/com.example.win10.mytest E/****: onPageSelected1
06-13 11:03:38.314 24907-24907/com.example.win10.mytest E/---->: onPageScrolled579
06-13 11:03:38.331 24907-24907/com.example.win10.mytest E/---->: onPageScrolled778
06-13 11:03:38.349 24907-24907/com.example.win10.mytest E/---->: onPageScrolled915
06-13 11:03:38.366 24907-24907/com.example.win10.mytest E/---->: onPageScrolled989
06-13 11:03:38.381 24907-24907/com.example.win10.mytest E/---->: onPageScrolled1034
06-13 11:03:38.399 24907-24907/com.example.win10.mytest E/---->: onPageScrolled1061
06-13 11:03:38.415 24907-24907/com.example.win10.mytest E/---->: onPageScrolled1073
06-13 11:03:38.432 24907-24907/com.example.win10.mytest E/---->: onPageScrolled1078
06-13 11:03:38.449 24907-24907/com.example.win10.mytest E/---->: onPageScrolled0
06-13 11:03:38.532 24907-24907/com.example.win10.mytest E/====: onPageScrollStateChanged0

总结:如果我们想要在页面即将滑动成功的时候就做一些事情,那么完全可以在onPageSelected()方法中执行,但可能会造成卡顿感;如果想要在滑动结束后再执行相应的方法,可以列用onPageScrollStateChanged方法,判断当state==0的时候,做相应操作。

猜你喜欢

转载自blog.csdn.net/u011508817/article/details/80670739
今日推荐