最近要弄一個(gè)viewpager的無限循環(huán)黄痪。網(wǎng)上找了看了下紧帕!
有在首頁和尾頁各加一個(gè)創(chuàng)造無限循環(huán)的,還有設(shè)置adapter無限數(shù)量的取值用余來算當(dāng)前位置的桅打,這邊就不說了是嗜!
然后我就研究了一下viewpager的addOnPageChangeListener事件
下面就來說下
首先
實(shí)現(xiàn)這個(gè)監(jiān)聽有3個(gè)方法
onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
監(jiān)聽滑動(dòng)的距離和當(dāng)前哪個(gè)頁面在滑動(dòng)
onPageSelected(int position)
監(jiān)聽滑動(dòng)成功之后處在在頁面
onPageScrollStateChanged(int state)
監(jiān)聽滑動(dòng)過程
這邊就是在onPageScrollStateChanged(int state)中的狀態(tài)進(jìn)行判斷做了一個(gè)比較簡(jiǎn)單的判斷
我們要知道state有3個(gè)狀態(tài)
ViewPager.SCROLL_STATE_IDLE | 閑置狀態(tài) |
ViewPager.SCROLL_STATE_DRAGGING | 拖動(dòng)狀態(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-", "第一頁 拖動(dòng)中");
}else if(cur == count - 1){
Log.e("-s-", "最后一頁 拖動(dòng)中");
}else{
Log.e("-s-", "其他頁 拖動(dòng)中");
}
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;
}
}
然后對(duì)一個(gè)有3個(gè)頁面的viewpager進(jìn)行以下滑動(dòng)
第一頁往左滑動(dòng)(無法滑動(dòng))
===> 第一頁往右滑動(dòng)(到第二頁)
===> 第二頁往右滑動(dòng)(到最后一頁)
===> 最后一頁往右滑動(dòng)(無法滑動(dòng))
log如下
我們能看到開始因?yàn)闊o法滑動(dòng)所以第一頁進(jìn)行了拖動(dòng)之后直接回到了閑置
之后從第一頁到第二頁的時(shí)候的顯示是第一頁拖動(dòng)然后進(jìn)入第二頁安放成功再回到第二頁閑置。
實(shí)現(xiàn)無限循環(huán)
經(jīng)過以上的log判斷我們可以在拖動(dòng)狀態(tài)加一個(gè)鎖挺尾,然后在安放的地方解除這個(gè)鎖鹅搪。在閑置的時(shí)候進(jìn)行頁面的強(qiáng)制跳轉(zhuǎn)不就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的無限循環(huán)
我們對(duì)剛才的代碼進(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-", "第一頁 拖動(dòng)中");
}else if(cur == count - 1){
Log.e("-s-", "最后一頁 拖動(dòng)中");
}else{
Log.e("-s-", "其他頁 拖動(dòng)中");
}
break;
case ViewPager.SCROLL_STATE_SETTLING:
isChange = true;
Log.e("-s-", "切換成功");
break;
}
}
然后我們?cè)谧鲆幌聞偛诺牟僮?br>
第一頁往左滑動(dòng)(強(qiáng)制到最后一頁)
===> 最后一頁往右滑動(dòng)(強(qiáng)制到第一頁)
===> 第一頁往右滑動(dòng)(到第二頁)
===> 第二頁往右滑動(dòng)(到最后一頁)
我們實(shí)現(xiàn)了循環(huán)操作并且生成的log如下
總結(jié)
這樣實(shí)現(xiàn)了無限的循環(huán)丽柿,但是有一點(diǎn)就是因?yàn)橹苯訌牡谝豁摶蛘咦詈笠豁撓虿荒芑瑒?dòng)的地方拖動(dòng),會(huì)發(fā)現(xiàn)不會(huì)出現(xiàn)viewpager自帶的滑動(dòng)距離效果魂挂。所以建議還是在首頁和尾頁各加一個(gè)新的頁面的方法甫题,這邊只是對(duì)無限循環(huán)進(jìn)行探討。