无限循环
在PagerAdapter.getCount();方法里返回Integer.MAX_VALUE。设置图片用ImageView.setBackgroundDrawable(pics[position % pics.length];来实现伪无限循环。
在第一页的前边和最后一页的后边添加两个缓冲页P0和Pm, Pm显示第一页的内容,P0显示最后一页的内容,当滑动到P0时,强制转到最后一页,当滑动到Pm时强制转到第1页。这种方式会有闪屏的问题。
放大缩小
在OnPageChangeListener.onPageScrolled()方法中控制滚动页的缩放。这种方式新进入的页面会忽大忽小。
利用官方提供的PageTransFormer实现。
mViewPager.setPageTransFormer(false, new ScalePageTransFormer);public class ScalePageTransFormer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.85f; private static final float MIN_ALPHA = 0.5f; @SuppressLint("NewApi") public void transformPage(View view, float position) { if (position < -1) {//看不到的一页,第一页前边 * view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); } else if (position <= 1) { if (position < 0) {//滑出的页 0.0 ~ -1 * float scaleFactor = (1 - MIN_SCALE) * (0 - position); view.setScaleX(1 - scaleFactor); view.setScaleY(1 - scaleFactor); } else {//滑进的页 1 ~ 0.0 * float scaleFactor = (1 - MIN_SCALE) * (1 - position); view.setScaleX(MIN_SCALE + scaleFactor); view.setScaleY(MIN_SCALE + scaleFactor); } } else {//看不到的另一页,最后一页后边 * view.setScaleX(MIN_SCALE); view.setScaleY(MIN_SCALE); } }}
结论
通过设置PagerAdapter.getCount()返回Integer.MAX_VALUE和PageTransFormer来实现无线循环带动画的Banner轮播图比较靠谱,虽然内存稍微多一些。