目标
构建一个循环ViewPager.
第一个元素允许您达到峰值到最后一个元素并向其滑动,反之亦然.您应该能够永远向任一方向滑动.
现在这已经完成,但这些问题对我的实现不起作用.以下是一些供参考:
我是如何尝试解决问题的
我们将使用大小为7的数组作为示例.要素如下:
[0][1][2][3][4][5][6]
Run Code Online (Sandbox Code Playgroud)
当你在元素0时,ViewPagers不允许你向左滑动!多么可怕:(.为了解决这个问题,我在正面和结尾添加了1个元素.
[0][1][2][3][4][5][6] // Original
[0][1][2][3][4][5][6][7][8] // New mapping
Run Code Online (Sandbox Code Playgroud)
当ViewPageAdapter请求(instantiateItem())元素0时,我们返回元素7.当ViewPageAdapter请求元素8时,我们返回元素1.
同样在ViewPager的OnPageChangeListener中,当使用0调用onPageSelected时,我们使用setCurrentItem(7),当使用8调用onPageSelected时,我们使用setCurrentItem(1).
这有效.
问题
当您从1向左滑动到0并且我们设置了CurrentItem(7)时,它将一直向右移动6个全屏幕.这并没有给出圆形ViewPager的外观,它给出了冲动到用户请求滑动动作的相反方向的最后一个元素的外观!
这非常非常刺耳.
我是如何试图解决这个问题的
我的第一个倾向是关闭平滑(即所有)动画.它有点好,但是当你从最后一个元素移动到第一个元素时,它现在变得不稳定,反之亦然.
然后我制作了自己的Scroller.
http://developer.android.com/reference/android/widget/Scroller.html
我发现在元素之间移动时始终有1次调用startScroll(),除非我从1移动到7和7移动到1.
第一个调用是方向和数量的正确动画.
第二个调用是将所有内容向右移动多个页面的动画.
这是事情变得非常棘手的地方.
我认为解决方案是跳过第二个动画.所以我做了.会发生一个平滑的动画,从1到7,有0个打嗝.完善!但是,如果你滑动,甚至点击屏幕,你会突然(没有动画)在元素6!如果你从7滑动到1,你实际上是在元素2.没有调用setCurrentItem(2)甚至调用OnPageChangeListener,表明你在任何时间点到达2.
但是你实际上并不是第2元,这有点好.您仍处于元素1,但将显示元素2的视图.然后当你向左滑动时,你会转到元素1.即使你已经真的在元素1上了......一些代码如何帮助清理:
动画被打破,但没有奇怪的副作用
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, duration);
}
Run Code Online (Sandbox Code Playgroud)
动画有效!但一切都很奇怪和可怕......
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
if (dx > 480 || dx < -480) …Run Code Online (Sandbox Code Playgroud)