实现方式1:给ViewPager的数量设为最大值,然后每次初始化时都求余。参考:http://blog.csdn.net/xiaanming/article/details/8966621
优点:效果好,最后一个和第一个之间的相互跳转与其他界面之间的跳转效果相同。
缺点:有bug。只有一个图片时不显示,两个图片时切换有空白。
实现方式2:通过判断onPageChangeListener()中方法onPageScrollStateChanged的状态来实现。
优点:无bug。
缺点:最后一个和第一个之间的相互跳转会有多个跳转过程(无法设置成只有一个跳转过程)。
实现方式3:尼玛,淘宝,你敢告诉我怎么做到的吗?京东是不会闹还是没闹出来?
我就说说实现方式2吧。
一、原理
除第一次外,ViewPager总是持有三个view实例。每次调用PagerAdapter的instantiateItem方法获取View实例时,传入的都是当前页面的位置的前一页。为了缓存一页,然后销毁掉后一项的后一页。ViewPager只保持当前页,前一页和后一页,超出就销毁。
二、代码
@Override
public void onPageScrollStateChanged(int arg0) {
switch (arg0) {
//手势滑动
case 1:
isScrolled=false;
break;
//界面切换
case 2:
isScrolled=true;
break;
//滑动结束
case 0:
// 当前为最后一张,此时从右向左滑,则切换到第一张
if (viewPager.getCurrentItem() == viewPager.getAdapter()
.getCount() - 1 && !isScrolled){
viewPager.setCurrentItem(0, false);
}
// 当前为第一张,此时从左向右滑,则切换到最后一张
else if (viewPager.getCurrentItem() == 0 && !isScrolled){
viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1, false);
}
<span style="white-space:pre"> </span>break;
default:
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {}
@Override
public void onPageSelected(int arg0) {
//设置选中的tip的背景
for(int i=0; i<tips.length; i++){
if(i==arg0 % mImageViews.length){
tips[i].setBackgroundResource(R.drawable.a2);
}else{
tips[i].setBackgroundResource(R.drawable.a3);
}
}
}
三、加入定时循环功能
// 开启线程无限自动移动
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
while(!isStop) {
// 每隔3秒钟, 发送一条消息到主线程, 更新viewpager的界面
SystemClock.sleep(3000);
runOnUiThread(new Runnable() {
@Override
public void run() {
// 此方法是在主线程中执行
int count=new MyPagerAdapter().getCount();
viewPager.setCurrentItem((viewPager.getCurrentItem() + 1)%count, false);
}
});
}
}
});
mThread.start();
四、几个函数
setCurrentItem(int):设置当前显示第几页(默认带跳转过程的动画)。
setCurrentItem(int, boolean)设置当前显示第几页,指定是否带跳转过程的动画。
getCurrentItem():获取当前显示第几页。