笔记60--ViewPager循环滑动

实现方式1:给ViewPager的数量设为最大值,然后每次初始化时都求余。参考:http://blog.csdn.net/xiaanming/article/details/8966621

优点:效果好,最后一个和第一个之间的相互跳转与其他界面之间的跳转效果相同。

缺点:有bug。只有一个图片时不显示,两个图片时切换有空白。

实现方式2:通过判断onPageChangeListener()中方法onPageScrollStateChanged的状态来实现。

优点:无bug。

缺点:最后一个和第一个之间的相互跳转会有多个跳转过程(无法设置成只有一个跳转过程)。

实现方式3:尼玛,淘宝,你敢告诉我怎么做到的吗?京东是不会闹还是没闹出来?

我就说说实现方式2吧。

一、原理

除第一次外,ViewPager总是持有三个view实例。每次调用PagerAdapter的instantiateItem方法获取View实例时,传入的都是当前页面的位置的前一页。为了缓存一页,然后销毁掉后一项的后一页。ViewPager只保持当前页,前一页和后一页,超出就销毁。

二、代码

@Override
public void onPageScrollStateChanged(int arg0) {
	switch (arg0) {
	//手势滑动
	case 1:
		isScrolled=false;
		break;
	//界面切换
	case 2:
		isScrolled=true;
		break;
	//滑动结束
	case 0:
		// 当前为最后一张,此时从右向左滑,则切换到第一张
		if (viewPager.getCurrentItem() == viewPager.getAdapter()
		.getCount() - 1 && !isScrolled){
			viewPager.setCurrentItem(0, false);
		}
		// 当前为第一张,此时从左向右滑,则切换到最后一张
		else if (viewPager.getCurrentItem() == 0 && !isScrolled){
			viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1, false);
		}
	<span style="white-space:pre">	</span>break;

	default:
		break;
	}
}

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

@Override
public void onPageSelected(int arg0) {
	//设置选中的tip的背景
	for(int i=0; i<tips.length; i++){
		if(i==arg0 % mImageViews.length){
			tips[i].setBackgroundResource(R.drawable.a2);
		}else{
			tips[i].setBackgroundResource(R.drawable.a3);
		}
	}
}

三、加入定时循环功能
// 开启线程无限自动移动
Thread mThread = new Thread(new Runnable() {
       	@Override
       	public void run() {
       		while(!isStop) {
        		// 每隔3秒钟, 发送一条消息到主线程, 更新viewpager的界面
        		SystemClock.sleep(3000);
        		
        		runOnUiThread(new Runnable() {
        			@Override
        			public void run() {
        				// 此方法是在主线程中执行
        				int count=new MyPagerAdapter().getCount();
        				viewPager.setCurrentItem((viewPager.getCurrentItem() + 1)%count, false);
        			}
        		});
       		}
       	}
});
mThread.start();
四、几个函数

setCurrentItem(int):设置当前显示第几页(默认带跳转过程的动画)。

setCurrentItem(int, boolean)设置当前显示第几页,指定是否带跳转过程的动画。

getCurrentItem():获取当前显示第几页。

五、源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值