[AS2.3.3]關(guān)于viewpager的無限循環(huán)

最近要弄一個viewpager的無限循環(huán)。網(wǎng)上找了看了下!
有在首頁和尾頁各加一個創(chuàng)造無限循環(huán)的,還有設(shè)置adapter無限數(shù)量的取值用余來算當(dāng)前位置的,這邊就不說了!


然后我就研究了一下viewpager的addOnPageChangeListener事件
下面就來說下

首先

實(shí)現(xiàn)這個監(jiān)聽有3個方法
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
監(jiān)聽滑動的距離和當(dāng)前哪個頁面在滑動

onPageSelected(int position)
監(jiān)聽滑動成功之后處在在頁面

onPageScrollStateChanged(int state)
監(jiān)聽滑動過程


這邊就是在onPageScrollStateChanged(int state)中的狀態(tài)進(jìn)行判斷做了一個比較簡單的判斷
我們要知道state有3個狀態(tài)

ViewPager.SCROLL_STATE_IDLE 閑置狀態(tài)
ViewPager.SCROLL_STATE_DRAGGING 拖動狀態(tài)
ViewPager.SCROLL_STATE_SETTLING 安放狀態(tài)

下面我在狀態(tài)判斷中寫入以下代碼

    @Override
    public void onPageScrollStateChanged(int state) {
        int cur = mViewPager.getCurrentItem();
        int count = adapter.getCount();

        switch (state){
            case ViewPager.SCROLL_STATE_IDLE:
                if (cur == 0){
                    Log.e("-s-", "第一頁 回歸閑置");
                }else if(cur == count - 1){
                    Log.e("-s-", "最后一頁 回歸閑置");
                }else{
                    Log.e("-s-", "其他頁 回歸閑置");
                }
                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                if (cur == 0){
                    Log.e("-s-", "第一頁 拖動中");
                }else if(cur == count - 1){
                    Log.e("-s-", "最后一頁 拖動中");
                }else{
                    Log.e("-s-", "其他頁 拖動中");
                }
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                if (cur == 0){
                    Log.e("-s-", "第一頁 安放成功");
                }else if(cur == count - 1){
                    Log.e("-s-", "最后一頁 安放成功");
                }else{
                    Log.e("-s-", "其他頁 安放成功");
                }
                break;
        }
    }

然后對一個有3個頁面的viewpager進(jìn)行以下滑動
第一頁往左滑動(無法滑動)
===> 第一頁往右滑動(到第二頁)
===> 第二頁往右滑動(到最后一頁)
===> 最后一頁往右滑動(無法滑動)
log如下


滑動打印.png

我們能看到開始因?yàn)闊o法滑動所以第一頁進(jìn)行了拖動之后直接回到了閑置

之后從第一頁到第二頁的時候的顯示是第一頁拖動然后進(jìn)入第二頁安放成功再回到第二頁閑置。


實(shí)現(xiàn)無限循環(huán)

經(jīng)過以上的log判斷我們可以在拖動狀態(tài)加一個鎖,然后在安放的地方解除這個鎖。在閑置的時候進(jìn)行頁面的強(qiáng)制跳轉(zhuǎn)不就可以實(shí)現(xiàn)一個簡單的無限循環(huán)

我們對剛才的代碼進(jìn)行修改

    private boolean isChange = false;

    @Override
    public void onPageScrollStateChanged(int state) {
        int cur = mViewPager.getCurrentItem();
        int count = adapter.getCount();

        switch (state){
            case ViewPager.SCROLL_STATE_IDLE:
                if (cur == 0){
                    if (!isChange){
                        Log.e("-s-", "并未切換成功,強(qiáng)制跳到最后一頁");
                        mViewPager.setCurrentItem(count,false);
                    }else{
                        Log.e("-s-", "第一頁 回歸閑置");
                    }
                }else if(cur == count - 1){
                    if (!isChange){
                        Log.e("-s-", "并未切換成功,強(qiáng)制跳到第一頁");
                        mViewPager.setCurrentItem(0,false);
                    }else{
                        Log.e("-s-", "最后一頁 回歸閑置");
                    }
                }else{
                    Log.e("-s-", "其他頁 回歸閑置");
                }
                break;
            case ViewPager.SCROLL_STATE_DRAGGING:
                isChange = false;
                if (cur == 0){
                    Log.e("-s-", "第一頁 拖動中");
                }else if(cur == count - 1){
                    Log.e("-s-", "最后一頁 拖動中");
                }else{
                    Log.e("-s-", "其他頁 拖動中");
                }
                break;
            case ViewPager.SCROLL_STATE_SETTLING:
                isChange = true;
                Log.e("-s-", "切換成功");
                break;
        }
    }

然后我們在做一下剛才的操作
第一頁往左滑動(強(qiáng)制到最后一頁)
===> 最后一頁往右滑動(強(qiáng)制到第一頁)
===> 第一頁往右滑動(到第二頁)
===> 第二頁往右滑動(到最后一頁)

我們實(shí)現(xiàn)了循環(huán)操作并且生成的log如下


循環(huán)滑動打印.png

總結(jié)

這樣實(shí)現(xiàn)了無限的循環(huán),但是有一點(diǎn)就是因?yàn)橹苯訌牡谝豁摶蛘咦詈笠豁撓虿荒芑瑒拥牡胤酵蟿?,會發(fā)現(xiàn)不會出現(xiàn)viewpager自帶的滑動距離效果。所以建議還是在首頁和尾頁各加一個新的頁面的方法,這邊只是對無限循環(huán)進(jìn)行探討。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容