Android开发--ViewPager自动循环滚动,手动换页

本文详细介绍了如何在Android开发中实现ViewPager的自动循环滚动和手动切换页面。首先,通过设置getCount返回无穷大实现无限滚动,再利用position取余数添加和删除页面。其次,创建线程并设定Handler,定时更新position实现自动循环。最后,通过isTouched变量判断用户是否在触摸,结合OnTouchListener和OnPageChangeListener确保手动滑动与自动滑动的平滑过渡。

     ViewPager以前有简单的用过,但没做过自动滚动和循环滚动,在实现起来还是有很多细节需要注意。总体思路:

     1.实现循环滚动的思路就是:

            1)将PagerAdapter的getCount方法返回值设为无穷大,这样就可以实现无限制的滑动,不会出现滑到头的时候。

            2)在每次添加新的View时,都是取当前position对总页数的取余数,然后得到要显示的页View进行添加,删除也是相同操作。

            3)设定最开始的要显示的ViewPager的currentItem为Integ.MAX的一半左右,这样保证可以向左循环滑动。

      2.实现自动循环的思路:

            设定一个变量position来记录当前ViewPager的位置,开启一个新的线程,每隔一定时间对position加1,并发送一个Message给Handler,在Handler中重新setCurrentItem。

       3.实现手动滑动与自动滑动结合:

             1)利用一个boolean变量isTouched来记录当前是否在触摸ViewPager,在ViewPager的setOnTouchListener中更新该值,只有在isTouched为false时才对Handler发送Message。

             2)在手动滑动页面时要改变position值,否则在下次自动滑动时position的值没有更新将报错,所以我们在ViewPager的setOnPageChangeListener中来更新position。

      接下来来动手实现自己的思路:

       1.首先重写PagerAdapter,实现思路一

package com.example.test;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class MyPagerAdapter extends PagerAdapter {

	private List<View> mList;

	public MyPagerAdapter(Context context, List<Integer> list) {
		mList = new ArrayList<View>();

		LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.MATCH_PARENT,
				LinearLayout.LayoutParams.MATCH_PARENT);
		for (int i = 0; i < list.size(); i++) {
			ImageView mImageView = new ImageView(context);
			mImageView.setLayoutParams(mParams);
			mImageView.setBackgroundResource(list.get(i));
			mList.add(mImageView);
		}
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return Integer.MAX_VALUE;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg0 == arg1;
	}

        //销毁上一页
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		// TODO Auto-generated method stub
		position = position % mList.size();
		container.removeView(mList.get(position));
	}

        <pre name="code" class="java">        //添加下一页
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		// TODO Auto-generated method stub
		position = position % mList.size();
		container.addView(mList.get(position));
		return mList.get(position);
	}

}


          2.在Activity中实现思路二和三
package com.example.test;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public final class MainActivity extends Activity {

	private ViewPager mPager;
	int position = 50000;
	private boolean isTouched = false;

	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			mPager.setCurrentItem(position);
		}

	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		mPager = (ViewPager) findViewById(R.id.main_viewpager);
		List<Integer> list = new ArrayList<Integer>();
		list.add(R.drawable.image1);
		list.add(R.drawable.image2);
		list.add(R.drawable.image3);
		list.add(R.drawable.image4);
		MyPagerAdapter adapter = new MyPagerAdapter(this, list);
		mPager.setAdapter(adapter);
		mPager.setCurrentItem(position);
                //实现思路三
                mPager.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View arg0, MotionEvent event) {
				// TODO Auto-generated method stub
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
				case MotionEvent.ACTION_MOVE:
					isTouched = true;
					break;
				case MotionEvent.ACTION_UP:
					isTouched = false;
				default:
					break;
				}
				return false;
			}
		});
		mPager.setOnPageChangeListener(new OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				position = arg0;
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
				
			}
		});
                //实现思路二
		Thread change = new Thread(new Runnable() {

			@Override
			public void run() {
				// TODO Auto-generated method stub
				while (true) {
					if (!isTouched) {
						position++;
						mHandler.sendEmptyMessage(0);
					}
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		});
		change.start();
	}

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值