ViewPager的滑动和滑动特效

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29654885/article/details/73250131

首先是OnPagerChangedListener执行顺序:


onPagerSelected方法只有在页面翻页的时候才会执行,而且是在 onPageScrollStateChanged方法之后,其 state必须为2,即为松手。onPageScrollChanged方法在手指按下去滑动,松开时,和停止滑动的时候执行。按下去的时候 state 为1,松开为2,停止滑动为0。
onpagerScrolled方法是在滑动的时候执行。什么也不做的时候,只要设置了 OnpagerChangedListener就会执行 OnpagerScrolled 的方法,其中,position为0,positionOffset为0.0,positionOffsetPixels为0。当然如果 viewpager 设置了 currentItem的话,postion 应该会变化。

这里由第一页到第二页0---->1
当向左滑的时候没有到能翻页的地方,之后松手,会回弹过去:
先执行onPageScrollStateChanged,state先为1。在执行onPageScrolled方法,postion为0,positionOffset逐渐变大,但没有到一个值大概是0.8(小于1),postionOffsetPixel 也是逐渐变大。-----> 松手之后再执行onPageScrollStateChanged,此时 state 为2。之后onPageScrolled方法,position 还是0,但 postionOffset逐渐减小,直到0.0,postionOffsetPixel也逐渐减小,直到0。------>最后执行PageScrollStateChanged方法,state为0.


当向左滑的时候到能翻页的地方:
先执行onPageScrollStateChanged,state先为1。在执行onPageScrolled方法,postion为0,positionOffset逐渐变大,但没有到一个值大概是0.8(小于1),postionOffsetPixel 也是逐渐变大。-----> 松手之后再执行onPageScrollStateChanged,此时 state 为2。之后执行onPageSelected方法,postion为1,之后onPageScrolled方法,position 还是0, postionOffset仍逐渐增大,直到1.0但没有到1,postionOffsetPixel也逐渐增大。之后 position 为1,positionOffset为0.0,positionOffsetPixel为0------>最后执行PageScrollStateChanged方法,state为0.


这里由第二页到第一页1---->0:
当向右滑的时候没有到能翻页的地方,之后松手,会回弹过去:
先执行onPageScrollStateChanged,state先为1。在执行onPageScrolled方法,postion为0,positionOffset逐渐减小,但没有到一个值大概是0.4,postionOffsetPixel 也是逐渐减小。-----> 松手之后再执行onPageScrollStateChanged,此时 state 为2。之后onPageScrolled方法,position 还是0,但 postionOffset逐渐增加,接近1,postionOffsetPixel也逐渐增加,接近1。之后 position 为1,positionOffset为0.0,positionOffsetPixel为0------>最后执行PageScrollStateChanged方法,state为0.


当向右滑的时候到能翻页的地方:
先执行onPageScrollStateChanged,state先为1。在执行onPageScrolled方法,postion为0,positionOffset逐渐减小,但没有到一个值大概是0.4,postionOffsetPixel 也是逐渐减小。-----> 松手之后再执行onPageScrollStateChanged,此时 state 为2。之后执行onPageSelected方法,postion为0,之后onPageScrolled方法,position 还是0, postionOffset仍逐渐减小,直到0.0但没有到0,postionOffsetPixel也逐渐减小。之后 position 为0,positionOffset为0.0,positionOffsetPixel为0------>最后执行PageScrollStateChanged方法,state为0.


其次是实现滑动最后一页再左滑,页面跳转:

viewpager 设置 onpagerChangedListener,重写 onPageScrolled 方法,其中 int position, float positionOffset, int positionOffsetPixels 有这三个参数,第一个 postion 参数,在刚开始滑动的时候是当前位置,滑动到一定位置时,为前一个或上一个。positionOffset 为偏移量,往左滑,为(0,1)变化。右滑为(1,0)变化。
positionOffsetPixels为偏移像素,左滑:(0,屏幕宽度),右滑:(屏幕宽度,0)。

因为最后一页再滑动的时候,onPagScrolled 里 postionOffset为0.0,positionOffPixel 为0,position为页面个数-1。继续左滑的话,只有 state会产生变化,当按下滑动的时候 state为1-->2-->0,由于从上一页滑到最后一页的时候,会出现 state=2或等于0的时候 postion=页面个数-1且 positionOffPixel 为0的时候。所以不能用 state==2或 state==0判断,所以判断应该为:

if (position == imgs.size()-1&&positionOffsetPixels==0&&mState==1){
finish();
}

Viewpager滑动特效:
setPageTransformer方法。


主要代码:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        Log.e("onPageScrolled:","position为"+position);
        Log.e("onPageScrolled:","positionOffset为"+positionOffset);
        Log.e("onPageScrolled:","positionOffsetPixels为"+positionOffsetPixels);
        if (position == imgs.size()-1&&positionOffsetPixels==0&&mState==1){
            finish();
        }
    }

    @Override
    public void onPageSelected(int position) {
        Log.e("onPageSelected:","position为"+position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        mState = state;
        Log.e("PageScrollStateChanged:","state"+state);
    }
});

viewPager.setPageTransformer(false, new ViewPager.PageTransformer() {
    @Override
    public void transformPage(View page, float position) {
        page.setPivotX(page.getMeasuredWidth()/2);
        page.setPivotY(page.getMeasuredHeight()/2);
        page.setRotationY(180*position);
    }
});



猜你喜欢

转载自blog.csdn.net/qq_29654885/article/details/73250131