Viewpager自动轮播,可修改滑动速度

Viewpager自动轮播,间隔时间5秒:

如果五秒内用户没有手动滑动viewpager,则自动跳转到下一页


/**
 * 配置viewPager
 */
private ExecutorService mExecutorService = Executors.newCachedThreadPool();//创建一个可缓存线程池
private int count = 0;//每次页面跳转时计数+1
private final ThreadLocal<Integer> selectcount = new ThreadLocal<Integer>() {
    @Override
    protected Integer initialValue() {
        return 0;
    }
};

public void setViewPager() {
    MyVPagerAdapter adapter = new MyVPagerAdapter(getActivity());

    mViewPager.setAdapter(adapter);
    //设置滑动速度
    try {
        Field mScroller = ViewPager.class.getDeclaredField("mScroller");
        mScroller.setAccessible(true);
        ChangeSpeedScroller scroller = new ChangeSpeedScroller(mViewPager.getContext(), new AccelerateInterpolator());
        scroller.setDuration(200);
        mScroller.set(mViewPager, scroller);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    //viewPager间隔5秒自动滑动
    final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //跳转到下一页
            mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
        }
    };
    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(final int position, final float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
          
            count++;
            //开启新线程
            mExecutorService.execute(new Runnable() {
                @Override
                public void run() {
                    //启动线程时将当前的count赋值给selectcount
                    selectcount.set(count);
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //线程沉睡5秒之后如果selectcount==count,即count值未发生改变,即viewpager未发生跳转
                    if (selectcount.get() == count) {
                        //线程沉睡期间页面未发生跳转则发送消息,否则不发送此条消息
                        mHandler.sendEmptyMessage(0);
                    }
                }
            });
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });
//初始设置为第6000个item,使viewpager开始时就支持用户手动向前滑动,其实只要设置个不是太小的数就行,没人会无聊到一直往前翻页
    mViewPager.setCurrentItem(6000);
}

修改Viewpager滑动速度的工具类:

import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

/**
 * Created by DR66 on 2016/6/15.
 * 继承scroller类,可实现修改滑动速度
 * 外部调用setDuration()即可修改滑动速度
 */
public class ChangeSpeedScroller extends Scroller {
    private int mDuration=250;

    public void setDuration(int duration) {
        mDuration = duration;
    }

    public ChangeSpeedScroller(Context context){
        super(context);
    }
    public ChangeSpeedScroller(Context context, Interpolator interpolator){
        super(context,interpolator);
    }
    public ChangeSpeedScroller(Context context, Interpolator interpolator,boolean flywheel){
        super(context,interpolator,flywheel);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
        super.startScroll(startX, startY, dx, dy, mDuration);
    }

    @Override
    public void startScroll(int startX, int startY, int dx, int dy) {
        super.startScroll(startX, startY, dx, dy);
    }
}

viewpager适配器,轮播页面是6页,这里的特别之处就是设置getCount()为一个很大的数,保证在手机关机前viewpager仍然没有跳转到最后一页

/**
 * by Dovar66 on 2016/6/6.
 * My life my tude!
 */
public class MyVPagerAdapter extends PagerAdapter {
    private int[] img = {R.drawable.viewpager01, R.drawable.viewpager02, R.drawable.viewpager03, R.drawable.viewpager04, R.drawable.viewpager05, R.drawable.viewpager06};
    private Context mContext;

    public MyVPagerAdapter(Context context) {
        mContext = context;
    }

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


    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view==object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {

        ImageView iv = new ImageView(mContext);
        iv.setImageResource(img[position%6]);
        iv.setScaleType(ImageView.ScaleType.FIT_XY);
        container.addView(iv);
        return iv;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
    }
}
我重新整理封装成了AutoViewPager,完整Demo查看请移步

阅读更多
上一篇Android6.0动态权限
下一篇实现网络打印工具类
想对作者说点什么? 我来说一句

viewPager自动轮播

2016年08月29日 13.76MB 下载

自动轮播viewpager

2017年03月29日 2.96MB 下载

viewPage 自动滑动

2015年11月21日 2.96MB 下载

Viewpager or TextView

2016年04月12日 2.33MB 下载

ViewPager实现广告自动轮播

2016年11月16日 1.69MB 下载

没有更多推荐了,返回首页

关闭
关闭