viewpager实现简单的轮播效果

关于viewpager轮播效果网上有很多的介绍,主流的方法基本就是几种:
1、给getCount返回一个很大的数比如Integer.MAX_VALUE,然后给用户一种无限循环的效果。
2、使用定时器 配合handler 实现循环轮播效果。
3、单纯使用Handler实现。
4、号称“真正”实现无限轮播效果,确实效果不错。上一张原理图,需要的具体自行搜索吧。

  1. 列表内容

(手残…… 忽喷)

我要说的是第二种,个人感觉比较简单的一种(第一种我不能接受……强迫症):
上主要代码:

private boolean isAutoPlay = true;
    在初始化页面的时候
    if(isAutoPlay){
        startPlay();
    }

    /**
     * 开始轮播图切换
     * scheduleAtFixedRate参数设置里可以改变轮播的时间间隔和执行时间
     * 我设置的单位是秒
     */
    private void startPlay() {
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new ViewShowTask (), 2, 3, TimeUnit.SECONDS);
    }

    /**
     * 执行轮播图切换任务
     * 使用handler切换
     */
    private class ViewShowTask implements Runnable {

        @Override
        public void run() {
            synchronized (mViewPager) {
                currentItem = (currentItem + 1) % topCourseList.size();
                handler.obtainMessage().sendToTarget();
            }
        }

    }
        //Handler
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //自动轮播到最后一页的时候 无动画切换到第一页
            // 这里我偷了懒 在从最后一页切换到第一页的时候,不使用切换效果,看起来就像是在无限循环 但是效果没有上边提到的其他方法的效果好
            if (currentItem == 0) {
                mViewPager.setCurrentItem(currentItem, false);
            } else {
                mViewPager.setCurrentItem(currentItem);
            }
        }

    };

下边是在轮播过程中 如果用户手动滑动时候的处理:

/**
     * ViewPager的监听器
     * 当ViewPager中页面的状态发生改变时调用
     */
    private class MyPageChangeListener implements ViewPager.OnPageChangeListener {

        boolean isAutoPlay = false;

        @Override
        public void onPageScrollStateChanged(int arg0) {
            switch (arg0) {
                case 1:// 手势滑动
                    isAutoPlay = false;
                    break;
                case 2:// 界面切换中
                    isAutoPlay = true;
                    break;
                case 0:// 滑动结束,即切换完毕或者加载完毕
                    // 当前为最后一张,此时从右向左滑,则切换到第一张
                    if (mViewPager.getCurrentItem() == mViewPager.getAdapter().getCount() - 1 && !isAutoPlay) {
                        mViewPager.setCurrentItem(0, false);
                    }
                    // 当前为第一张,此时从左向右滑,则切换到最后一张
                    else if (mViewPager.getCurrentItem() == 0 && !isAutoPlay) {
                        mViewPager.setCurrentItem(mViewPager.getAdapter().getCount() - 1, false);
                    }
                    currentItem = mViewPager.getCurrentItem();
                    //记录当前的页码
                    break;
                default:
                    break;
            }
        }

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

        }

        @Override
        public void onPageSelected(int pos) {

        }

    }
    mViewPager.setOnPageChangeListener(new MyPageChangeListener());
//如果使用了ViewPagerIndictor    则要给Indictor设置监听
//mIndictor.setOnPageChangeListener(new MyPageChangeListener());

关于滑动的几种状态请看本人另一篇博文:http://blog.csdn.net/codenoodles/article/details/50706821

部分代码借鉴的网上大神的代码,翻了半天没找到原作者,如果有问题 请告诉我。需要注意的是 在手动滑动之后,页码不再是之前自动轮播的顺序,这个时候需要在滑动结束之后保存一下页码, currentItem = mViewPager.getCurrentItem();不然会出现顺序混乱。

有问题或者不足,欢迎留言指正。 顺便提一下老大的QQ群:454430053 欢迎小伙伴们加入。

posted @ 2016-02-22 13:53  Z漫步  阅读(719)  评论(0编辑  收藏  举报