使用ViewPager实现图片轮播应该是大家很熟悉的做法。但是ViewPager有个缺点,不支持循环播放,滚到最右边不能继续右滚,同样,滚到最左边也不能继续左滚。这是个令人头疼的事情,好在程序员们神通广大,大家提出了两种方法解决这个问题。
1. 假无限循环。把PagerAdapter的getCount设为Integer.max,这样在一般情况下都不可能滚到边缘,达到无限循环的效果。但理论上它不是真的无限循环。
2. 真无限循环。假设有三张需要显示的图片ABC,额外在首尾添加两张辅助图片,形成序列CABCA。当向右滚动到最右的A时,立即跳转到左边的第二个图片A,当向左滚动到最左的C时,立即跳转到右边的倒数第二个图片C,这两次跳转使用语句setCurrentItem(1, false)和setCurrentItem(viewPager.getAdapter.getCount() - 2, false)。注意,由于第二个参数使用了false,因此跳转不会产生动画效果,因此这两次跳转对用户而言是不可见的,于是达到了无限循环的效果。这是真正的无限循环。
像我这样的强迫症患者基本都会选择真无限循环,为了避免理论上的一丝丝出错的可能。可不幸的是,真无限循环并没有想象中那么完美,在网友的大部分解决方案中,都存在这么一点点瑕疵,而这一点点瑕疵对于一名追求完美的程序员来说都是致命的。问题就出在从最后一个滚动到第一个的过程中。以上面图片序列CABCA为例,通常的解决方案如下图所示
当从C到A滚动时,我们会发现C的动画效果未完成就瞬间切到了A。对应这个图,其实是因为1的动画未完成就