网上搜了很多文章,思路是假设要显示三张图片A B C,在list中按索引从小到大存放为C A B C A,初始化时viewPager.setCurrentItem(1),显示实际需要播放图片的第一张A,以后滑动时,如果从1滑动到0,就setCurrentItem(3),因为第0张存放的是C,滑动到0就跳转到3也是C,所以看不出变化OnPageChangeListener中。
起初我是按照网上搜到的其他文章中,写到OnPageChangeListener的onPageScrolled()中,内容如下
pageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { int count = imageViewList.size(); if (position == 0) { viewPager.setCurrentItem(count - 2, false); } else if (position == count - 1) { viewPager.setCurrentItem(1, false); } } @Override public void onPageSelected(final int position) { } @Override public void onPageScrollStateChanged(int state) { } };
这样手指向左滑动时,从3->4,运行onPageScrolled中的逻辑,跳转到1确实没问题,但是从1->0时按onPageScrolled中的逻辑本应该跳转到3就结束,不知道为什么又触发了一次onPageChangeListener,跳转到3之后又向前跳转了一页,跳转到2了。后来修改了逻辑,把这部分跳转的逻辑写到onPageSelected中,如下所示
pageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(final int position) { final int count = imageViewList.size(); if (position == 0 || position == count - 1) { new Handler().postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(Math.abs(count - position - 2), false); } }, 200); } } @Override public void onPageScrollStateChanged(int state) { } };当position=0或4时,如果立刻setCurrentItem跳转,会变成明显的一闪而过,而不是滑动效果,这里通过handler.postDelayed延迟跳转,肉眼已经看不出有不一样的滑动效果了。
http://blog.csdn.net/lmj623565791/article/details/40411921这里还有ViewPager的页面切换效果,试了一下挺有意思的,基本就是自己写一个Transform类实现PageTransformer接口,然后viewPager.setPageTransformer(new Transform())就好了