viewpager在实现自动播放时,比较容易。现在需要加入手动无限循环。如下图:
网上一般代码都会存在一定问题,并不能非常流畅。大M现修正并上传源码供大家使用。下面说说简单的实现和注意地方。加载图片用了ImageCacheLoader,可以任意替换如glide等其他第三方图片加载。
为了无缝显示图片,存储图片的时候才用如下思想:
- 若共5张图片:ABCDE,则保存图片list的时候需要这样保存EABCDEA
/**
* 如果图片大于1则进行前后各加1个图片的处理,imageurls为真实图片地址。
* */
private void getModifyUriList(ArrayList<String> imageurls) {
int length = uriList.size();
if (length > 1) {
uriList.add(0, uriList.get(length - 1));
uriList.add(length + 1, uriList.get(1));
}
}
- 接着就是要实现OnPageChangeListener接口,onPageScrollStateChanged的三个状态,网上说的大部分都是错的解释,建议查看手册。
class MyOnPageChangeListener implements OnPageChangeListener {
int oldPosition = 0;@Override
public void onPageSelected(int position) {
currentItem = position;
if (title != null && titles != null) {
title.setText(titles[position]);
}
if (dots != null && dots.size() > 0) {
if (position == 1 || position == getAdapter().getCount() - 1) {
// 如果是第一图片被选中,则就将第一个点显示红
dots.get(oldPosition).setBackgroundResource(
dot_normal_resId);
dots.get(1).setBackgroundResource(dot_focus_resId);
} else if (position == 0
|| position == getAdapter().getCount() - 2) {
// 如果是最后一个图片被选中,则就将最后一个图片点显示红
dots.get(oldPosition).setBackgroundResource(
dot_normal_resId);
dots.get(getAdapter().getCount() - 2)
.setBackgroundResource(dot_focus_resId);
} else {
dots.get(position).setBackgroundResource(dot_focus_resId);
dots.get(oldPosition).setBackgroundResource(
dot_normal_resId);
}
}
oldPosition = position;
}
/** onPageScrollStateChanged方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。 */
@Override
public void onPageScrollStateChanged(int arg0) {
switch (arg0) {
case 1:// 手势滑动,如果这里不设置,快速滑动的时候会有问题,可自行注释后测试
// 当前为最后一张,此时从右向左滑,则切换到第一张
if (getCurrentItem() == getAdapter().getCount() - 1) {
setCurrentItem(1, false);
}
// 当前为第一张,此时从左向右滑,则切换到最后一张
else if (getCurrentItem() == 0) {
setCurrentItem(getAdapter().getCount() - 2, false);
}
break;
case 2:
break;
case 0:// 滑动结束,即切换完毕或者加载完毕
// 当前为最后一张,此时从右向左滑,则切换到第一张
if (getCurrentItem() == getAdapter().getCount() - 1) {
setCurrentItem(1, false);
}
// 当前为第一张,此时从左向右滑,则切换到最后一张
else if (getCurrentItem() == 0) {
setCurrentItem(getAdapter().getCount() - 2, false);
}
break;
}
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
}
Demo下载地址:http://download.youkuaiyun.com/detail/minkex/9243413