关于viewpager轮播效果网上有很多的介绍,主流的方法基本就是几种:
1、给getCount返回一个很大的数比如Integer.MAX_VALUE,然后给用户一种无限循环的效果。
2、使用定时器 配合handler 实现循环轮播效果。
3、单纯使用Handler实现。
4、号称“真正”实现无限轮播效果,确实效果不错。上一张原理图,需要的具体自行搜索吧。
我要说的是第二种,个人感觉比较简单的一种(第一种我不能接受……强迫症):
上主要代码:
private boolean isAutoPlay = true;
在初始化页面的时候
if(isAutoPlay){
startPlay();
}
/**
* 开始轮播图切换
* scheduleAtFixedRate参数设置里可以改变轮播的时间间隔和执行时间
* 我设置的单位是秒
*/
private void startPlay() {
scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(new ViewShowTask (), 2, 3, TimeUnit.SECONDS);
}
/**
* 执行轮播图切换任务
* 使用handler切换
*/
private class ViewShowTask implements Runnable {
@Override
public void run() {
synchronized (mViewPager) {
currentItem = (currentItem + 1) % topCourseList.size();
handler.obtainMessage().sendToTarget();
}
}
}
//Handler
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//自动轮播到最后一页的时候 无动画切换到第一页
// 这里我偷了懒 在从最后一页切换到第一页的时候,不使用切换效果,看起来就像是在无限循环 但是效果没有上边提到的其他方法的效果好
if (currentItem == 0) {
mViewPager.setCurrentItem(currentItem, false);
} else {
mViewPager.setCurrentItem(currentItem);
}
}
};
下边是在轮播过程中 如果用户手动滑动时候的处理:
/**
* ViewPager的监听器
* 当ViewPager中页面的状态发生改变时调用
*/
private class MyPageChangeListener implements ViewPager.OnPageChangeListener {
boolean isAutoPlay = false;
@Override
public void onPageScrollStateChanged(int arg0) {
switch (arg0) {
case 1:// 手势滑动
isAutoPlay = false;
break;
case 2:// 界面切换中
isAutoPlay = true;
break;
case 0:// 滑动结束,即切换完毕或者加载完毕
// 当前为最后一张,此时从右向左滑,则切换到第一张
if (mViewPager.getCurrentItem() == mViewPager.getAdapter().getCount() - 1 && !isAutoPlay) {
mViewPager.setCurrentItem(0, false);
}
// 当前为第一张,此时从左向右滑,则切换到最后一张
else if (mViewPager.getCurrentItem() == 0 && !isAutoPlay) {
mViewPager.setCurrentItem(mViewPager.getAdapter().getCount() - 1, false);
}
currentItem = mViewPager.getCurrentItem();
//记录当前的页码
break;
default:
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int pos) {
}
}
mViewPager.setOnPageChangeListener(new MyPageChangeListener());
//如果使用了ViewPagerIndictor 则要给Indictor设置监听
//mIndictor.setOnPageChangeListener(new MyPageChangeListener());