好久也没写过博客了,今天兴致大发突然想写一篇博客,哈哈哈哈.....
今天的博客是关于无限轮播的广告,无限轮播的广告在各个市场应用是相当常见的,可能平时我们自己做的东西中是没有无限播放的。只是单次播放完之后直接跳到了第一页,当用户想从最后一张向右滑动的时候,却发现滑不动了,这是种不太好的体验.....
废话不多说了,先上个动图看看
1.实现方式的原理
其实就是在数据集中增加了两张图片,在首位置增加最后一个图片,在最后一个位置增加第一张图片,然后处理滑动边界的时候,通过滑动边界的一些处理做到了伪无限循环。比如你从倒数第二张图片向滑动的时候,此时右边显示的图片是第一张图片,待你滑动完成时,也就是最后一张图片完全显示出来的时候,viewpager的位置立即切换到第二项,现在这时候显示出来的是第一张图片,指示器的位置也切换到第一个位置。这样就重新进行下一轮的循环啦。从第一张图片往左划的原理也是一样的。接下来从代码上讲讲一些道理。
2.重写的viewpager中滑动边界处理的代码
OnPageChangeListener mOnPagerChangeListener = new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (null != getAdapter() && getAdapter().getCount() > 1) {
int count = getAdapter().getCount();
if (position == 1 && prePosition == count - 1) {
prePosition = position;
return;
}else if (position == count - 2 && prePosition == 0) {
prePosition = position;
return;
}
callBackIndicatotPosition(toRealPosition(position));
prePosition = position;
}
}
@Override
public void onPageScrollStateChanged(int state) {
PagerAdapter adapter = getAdapter();
if (adapter != null && adapter.getCount() > 1) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int count = adapter.getCount();
if (getCurrentItem() == 0) {
setCurrentItem(count - 2,false);
} else if (getCurrentItem() == count - 1) {
setCurrentItem(1,false);
}
}
}
}
};OnPageChangeListener mOnPagerChangeListener = new OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (null != getAdapter() && getAdapter().getCount() > 1) {
int count = getAdapter().getCount();
if (position == 1 && prePosition == count - 1) {
prePosition = position;
return;
}else if (position == count - 2 && prePosition == 0) {
prePosition = position;
return;
}
callBackIndicatotPosition(toRealPosition(position));
prePosition = position;
}
}
@Override
public void onPageScrollStateChanged(int state) {
PagerAdapter adapter = getAdapter();
if (adapter != null && adapter.getCount() > 1) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int count = adapter.getCount();
if (getCurrentItem() == 0) {
setCurrentItem(count - 2,false);
} else if (getCurrentItem() == count - 1) {
setCurrentItem(1,false);
}
}
}
}
};
* 用于回调指示器的位置
* @param position
*/
private void callBackIndicatotPosition(int position) {
if (null != pageChangeListeners && position >= 0) {
for (OnPageChangeListener temp : pageChangeListeners) {
temp.onPageSelected(position);
}
}
};
/**
* 计算出指示器正确的显示位置
*/
private int toRealPosition(int position) {
if (getAdapter() != null && getAdapter().getCount() > 1) {
int count = getAdapter().getCount();
if (position == count - 1) {
return 0;
}else if (position == 0) {
return count - 3;
}else{
return position - 1;
}
}
return 0;
}
prePosition = position;
return;
}
int count = mImageViews.size();
if (mImageViews.size() > 1) {
return count + 2;
} else {
return count;
}
}
public Object instantiateItem(ViewGroup container, int position) {
int realPosition = position;
int count = mImageViews.size();
if (count > 0) {
if (position == 0) {
realPosition = count - 1;
}else if (position == getCount() - 1) {
realPosition = 0;
} else {
realPosition = position - 1;
}
}
int Drawable = mImageViews.get(realPosition);
if (null == mViews.get(position)) {
onCreatView(position,Drawable);
}
ImageView view = mViews.get(position);
view.setImageResource(Drawable);
container.removeView(view);
container.addView(view);
return view;
}