您的位置:首页 > 其它

使用ViewPager实现自动无限循环的轮播

2015-10-27 16:55 816 查看
别人都说使用ViewPager轮播很简单,但还是需要自己手动来操作下。顺便总结下实现无限循环轮播的思路。



要使用ViewPager实现无限循环播放的轮播,会涉及到以下知识点:

1、ViewPager的使用

2、怎样实现无限循环?

3、怎样实现自动播放?

1、ViewPager的应用

ViewPager应用很简单,只需使用android.support.v4.view.ViewPager组件即可,同ListView一样,需要给它指定一个适配器。

四大函数略。

2、实现无限循环

当banner位于1屏,向左滑动,此时位于最后一屏,

当banner位于最后一屏,向右滑动,此时位于第一屏。

[code]private class BannerAdapter extends PagerAdapter{

        private LayoutInflater mInflater;

        public BannerAdapter(Context context){
            mInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return Max_Size;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position %= Default_Size;
            View view = mInflater.inflate(R.layout.item, container,false);
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            imageView.setImageResource(mImageSrc[position]);
            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public void finishUpdate(ViewGroup container) {
            //获取当前banner的索引
            int position = mBanner.getCurrentItem();
            //屏幕0切换为屏幕3
            if (position == 0){
                currentPosition = Default_Size;
                //banner设置当前索引
                mBanner.setCurrentItem(currentPosition, false);
            }
            //当下标达到99时,将其切换到第2屏
            else if (position == Max_Size-1){
                currentPosition = Default_Size-1;
                mBanner.setCurrentItem(currentPosition, false);
            }
            super.finishUpdate(container);
        }

    }


三、实现自动播放

[code]private Handler mHandler = new Handler();
    private long lasttime;
    private Runnable mRunnable = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (System.currentTimeMillis() -lasttime>3000){
                currentPosition++;
                viewHandler.sendEmptyMessage(currentPosition);
                lasttime = System.currentTimeMillis();
            }
            mHandler.postDelayed(mRunnable, 3000);
        }
    };


完整代码:

[code]public class MainActivity extends Activity {

    private ViewPager mBanner;
    private ImageView[] mPositionViews;
    private BannerAdapter mAdapter;
    private int currentPosition = 0;
    private final int Max_Size = 100;
    private final int Default_Size =3;
    private int[] mImageSrc = {
            R.drawable.img1,
            R.drawable.img2,
            R.drawable.img3
    };

    private Handler mHandler = new Handler();
    private long lasttime;
    private Runnable mRunnable = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (System.currentTimeMillis() -lasttime>3000){
                currentPosition++;
                viewHandler.sendEmptyMessage(currentPosition);
                lasttime = System.currentTimeMillis();
            }
            mHandler.postDelayed(mRunnable, 3000);
        }
    };

    private Handler viewHandler = new Handler(){
        public void handleMessage(android.os.Message msg) {
            mBanner.setCurrentItem(msg.what);
        }
    };

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

    private void setBannerPosition(int position){

        position %= Default_Size;
        for (ImageView imageView:mPositionViews){
            imageView.setImageResource(R.drawable.indicator_unchecked);
        }
        mPositionViews[position].setImageResource(R.drawable.indicator_checked);
    }

    private void init() {

        mPositionViews = new ImageView[]{
                (ImageView) findViewById(R.id.position_1),
                (ImageView) findViewById(R.id.position_2),
                (ImageView) findViewById(R.id.position_3),
        };
        mBanner = (ViewPager) findViewById(R.id.banner);
        mAdapter = new BannerAdapter(this);
        mBanner.setAdapter(mAdapter);
        mHandler.postDelayed(mRunnable, 3000);
        mBanner.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                currentPosition = arg0;
                setBannerPosition(currentPosition);
            }

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

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {

            }
        });

    }

    private class BannerAdapter extends PagerAdapter{

        private LayoutInflater mInflater;

        public BannerAdapter(Context context){
            mInflater = LayoutInflater.from(context);
        }

        @Override
        public int getCount() {
            return Max_Size;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            position %= Default_Size;
            View view = mInflater.inflate(R.layout.item, container,false);
            ImageView imageView = (ImageView) view.findViewById(R.id.image);
            imageView.setImageResource(mImageSrc[position]);
            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }

        @Override
        public void finishUpdate(ViewGroup container) {
            //获取当前banner的索引
            int position = mBanner.getCurrentItem();
            //屏幕0切换为屏幕3
            if (position == 0){
                currentPosition = Default_Size;
                //banner设置当前索引
                mBanner.setCurrentItem(currentPosition, false);
            }
            //当下标达到99时,将其切换到第2屏
            else if (position == Max_Size-1){
                currentPosition = Default_Size-1;
                mBanner.setCurrentItem(currentPosition, false);
            }
            super.finishUpdate(container);
        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: