viewpager无限左右滑动

原创 2015年07月08日 17:25:27

以下文章是从几个网上demo中结合而来的,感谢前辈们提供的肩膀,所以之后的事我们才能做的轻松愉快,

之前找了几个demo要么运行时有点BUG,要么就是直接将viewpager的页数设置的很大,用户难以滑动到边界,看似像无限滑动,但是如果用户有足够的耐性,终有一刻会滑完,所以,认为此方法不是很好,接下来的这个demo个人修改了一下,自认为没有什么大的BUG,注释都写在了代码中,原理大家可以从网络上看一下,就是总共的viewpager的页数其实是比原始的页数页数多了两页,就最前面多一页,最后面多一页,详细的情况请看网络解释,上代码了

这里是适配器MyAdapter代码

public class MyAdapter extends PagerAdapter {
private ImageView[] mImageViews;


public MyAdapter(ImageView[] mImageViews) {
this.mImageViews = mImageViews;
}


@Override
public int getCount() {
return mImageViews.length;
}


@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}


@Override
public void destroyItem(View container, int position, Object object) {
((ViewPager) container).removeView(mImageViews[position
% mImageViews.length]);


}


/**
* 载入图片进去,用当前的position 除以 图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(View container, int position) {
((ViewPager) container).addView(mImageViews[position
% mImageViews.length], 0);
return mImageViews[position % mImageViews.length];
}


}



这里是viewpager滑动监听类代码

public class MyOnPageChangeListener implements OnPageChangeListener {
private boolean mIsChanged = false;
private ImageView[] mImageViews;
private ViewPager viewPager;
private int currentIndex = 1;


public MyOnPageChangeListener(ImageView[] mImageViews, ViewPager viewPager) {
this.mImageViews = mImageViews;
this.viewPager = viewPager;
}


// 第二步
@Override
public void onPageScrollStateChanged(int arg0) {
if (ViewPager.SCROLL_STATE_IDLE == arg0) {// 当页面停止滑动后,触发该条件
if (mIsChanged) {// 并且已经执行完了onPageSelected()方法,
//因为该方法在一次滑动中会被重复调用,所以使用一个标志量来区分是不是最后一次调用
mIsChanged = false;


// 下面这个方法是悄悄更换当前页面,并且不使用动画,所以用户看不到效果,
//用户以为是第0页,其实现在是倒数第2页,或者用户以为是最后一页,其实是第1页
viewPager.setCurrentItem(currentIndex, false);
}
}
}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}


// 第一步
// 以下逻辑是实现循环的关键,请仔细阅读
@Override
public void onPageSelected(int position) {
mIsChanged = true;// viewpager滑动完毕标志,现在处于未滑动状态


if (mImageViews.length > 1) { // 当图片数量多于1张时,方可循环滑动


if (position == 0) {// 当前页面为0,即当前图片和真实图片中的最后一张相同时


// 这里是滑动到最左边,此时继续向左滑动,方可触发该条件


currentIndex = mImageViews.length - 2;// 将当前页面改为真实图片中的最后一张的页数


} else if (position == mImageViews.length - 1) {// //当前页面为最后一张时,即当前图片和真实图片中的第一张相同时


// 这里是滑动到最右边,此时继续向右滑动,方可触发该条件


currentIndex = 1;// 将当前页面改为真实图片中的第一张的页数


} else {


currentIndex = position;// 其余状态不该,保持常态


}
}
}


}



这里是activity代码

public class MyActivity extends Activity {
/**
* ViewPager
*/
private ViewPager viewPager;


/**
* 装点点的ImageView数组
*/
private ImageView[] tips;


/**
* 装ImageView数组
*/
private ImageView[] mImageViews;


/**
* 图片资源id
*/
private int[] imgIdArray;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}


private void init() {
viewPager = (ViewPager) findViewById(R.id.viewPager);


// 载入图片资源ID,注意我们载入的图片中,有两张图片是一样的这里是关键
imgIdArray = new int[] { R.drawable.item08, R.drawable.item01,
R.drawable.item02, R.drawable.item03, R.drawable.item04,
R.drawable.item05, R.drawable.item06, R.drawable.item07,
R.drawable.item08, R.drawable.item01 };


// 将图片装载到数组中
mImageViews = new ImageView[imgIdArray.length];
for (int i = 0; i < mImageViews.length; i++) {
ImageView imageView = new ImageView(this);
mImageViews[i] = imageView;
imageView.setBackgroundResource(imgIdArray[i]);
}
// 设置Adapter
viewPager.setAdapter(new MyAdapter(mImageViews));
// 设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(new MyOnPageChangeListener(
mImageViews, viewPager));
// 设置初始页面,这样用户看到的就是第一张,往左滑动,看到的是第七张,其实是第0张而已
viewPager.setCurrentItem(1);
}
}



最后上配置上布局文件,很简单的

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center">"
    
   <android.support.v4.view.ViewPager  
        android:id="@+id/viewPager"  
        android:layout_width="fill_parent"  
        android:layout_height="200dp" /> 
        
</RelativeLayout>


android 打造真正的无限循环viewpager

通过监听viewpager的滑动实现无限循环,并解决边界的不友好跳转问题
  • anyfive
  • anyfive
  • 2016年09月13日 13:56
  • 7489

Android高仿广告条用ViewPager实现左右完美无限滑动

  • 2014年02月25日 16:44
  • 2.28MB
  • 下载

ViewPager实现左右无限循环效果

在网上找了很多,发现都是一个原理
  • oWeiXiao123
  • oWeiXiao123
  • 2014年04月11日 17:26
  • 38737

ViewPager实现真正的左右无限循环滑动

最近由于项目需要需要实现类似于广告那种
  • ywl5320
  • ywl5320
  • 2014年11月04日 22:57
  • 2955

Android 使用ViewPager真正实现左右无限滑动(附源码)

前言         网上有很多使用ViewPager实现左右滑动这一效果的资料,这些资料大多数都是将PagerAdapter中getCount()方法的返回值设为Integer.MAX_V...
  • u013693649
  • u013693649
  • 2016年08月13日 17:48
  • 1326

Android ViewPager无限滑动(支持左右,无传入数量限制)方式一

实现思路: 主要通过三个View来实现这个功能 显示是靠中间,左右View,是用于切换以及滑动看到预览UI viewPager.setCurrentItem(pos false); ...
  • BlogRecord
  • BlogRecord
  • 2015年08月13日 21:52
  • 1141

Android ViewPager 无限循环左右滑动(可自动) 实现

对于ViewPager 广告页 这个功能 很多APP都有这个功能 在网上也看过一些资料,我就在这把我自己完整的实现方法写出来吧 Demo放在最下面 基础的ViewPager: ...
  • u012760183
  • u012760183
  • 2016年08月17日 14:43
  • 5033

ViewPager无限循环滑动无卡顿,详解OnPageChangeListener

说下OnPageChangeListener这个接口的三个方法: onPageScrolled(int position, float positionOffset, int positionOffs...
  • happy_fsyy
  • happy_fsyy
  • 2016年07月27日 22:29
  • 2142

真无限循环的ViewPager——解决两端滑动的平滑问题

使用ViewPager实现图片轮播应该是大家很熟悉的做法。但是ViewPager有个缺点,不支持循环播放,滚到最右边不能继续右滚,同样,滚到最左边也不能继续左滚。这是个令人头疼的事情,好在程序员们神通...
  • u010829418
  • u010829418
  • 2016年01月06日 17:36
  • 6222

viewPager 重写 预加载缓存左右滑动等

修改ViewPage的r预加载,左右滑动,切换经过中间页问题,ViewPager一屏显示多张图片 1.屏蔽切换的时候需要经过中间页2.屏蔽ViewPager的滑动3.预加载问题 import...
  • u010023795
  • u010023795
  • 2017年02月07日 14:57
  • 457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:viewpager无限左右滑动
举报原因:
原因补充:

(最多只允许输入30个字)