Android:ViewPager画廊效果真循环滑动,(真)首尾
一:实现真无限循环
网上实现ViewPager无限循环的方式大概有两种:
1. 使adapter的getCount()返回Integer.MAX_VALUE,再在初始化时设置当前页面为第几百几千页(如:ViewPager.setCurrentItem(100*data.size));
2. 通过监听viewpager的滑动来设置页面。如当前有数据123,则设置页面为31231,当页面滑动到第一个3时,设置当前页面为第二个3,那么左右都可以滑动,当其滑动到第二个1时同理。
循环:android 打造真正的无限循环viewpager,先看完这篇文章。
画廊效果:ViewPager实现画廊效果,这是画廊效果实现。
这两种方法都有弊端。
第一种方法,ViewPager.setCurrentItem(100*data.size)),如果100*data.size过大,会导致ANR,如果100*data.size过小,会导致用户有可能滑动到尽头。尽管只有1%可能性发生这种情况,那也是我们程序员不容许的。
第二种方法,亲自试过,虽然比在onPageSelected设置跳转好,但是还是有一些问题,当向右滑动时,滑动到尽头,但是此时可能动画还没结束,还不能跳转。但是我们的ViewPager是画廊效果的,导致右边出现空白。
image这两种方法都有缺点,那么我们需要对这两种方法进行改进。第一种方法没有继续改进的空间。所以我们要对第二种方法进行改进。
改进
ViewPgaer有三页,1 2 3,参考文章中,使得3 1 2 3 1,并且处理了首尾处。但是切换动画还没结束,导致少了一页,显得循环不连贯,所以我们可以补充缺失的页面。所以,2 3 1 2 3 1 2,把缺失的页面加上,就显得循环连贯。因为ViewPager是画廊效果,所以导致了另外一个问题,当快速滑动,跳过了首的3,和尾的1,直接到了我们补充的缺失的页面2,就会使得循环失效。这种情况,我们可以使ViewPager每次滑动只能滑动一页。
二:ViewPager每次滑动只能滑动一页
画廊效果ViewPager的父布局的事件传递给ViewPager处理。
rlContent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return viewpager.dispatchTouchEvent(event);
}
});
所以直接在ViewPager处理事件
viewpagerp.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
//得到当前点击时,距离屏幕的X坐标
x = (int)event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
//如果移动的X轴距离大于某个值,这个值根据需求进行改动
if(Math.abs(x - event.getRawX()) > 某个值){
//设置事件为MotionEvent.ACTION_UP强行结束该事件
event.setAction(MotionEvent.ACTION_UP);
}
break;
case MotionEvent.ACTION_UP:
//事件结束,充值x为0
x = 0;
break;
}
return false;
}
});
代码注释已经写清楚了。