关闭

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

标签: viewpager自动轮播滑动速度无限轮播
2277人阅读 评论(1) 收藏 举报

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查看请移步

0
0
查看评论

改变ViewPager的翻页速率

当你在使用ViewPager控件时,是否觉得
  • qiyijay
  • qiyijay
  • 2014-05-05 18:22
  • 1456

ViewPager 设置滑动翻页距离(亲测有效!)

前言:老板说,android项目的这个viewpager不灵敏,需要滑动较长的距离才可以翻页。要求缩短滑动距离,实现较短距离翻页。 这个东西,确实不好弄,网上查了很多资料,试验了很多方法,直到下面转载的文章,解决了我的问题。注意,要修改viewpager的源码,也就是说,要把Viewpager...
  • zrbcsdn
  • zrbcsdn
  • 2017-02-12 11:36
  • 2438

viewPager控制滑动速度和时间

遇到如下问题:viewpager滑动时如果想跳过很多条直接到最后一条,中间会黑屏。黑屏是因为中间的view没有加载出来的缘故。 stackOverflow上看到的解决方案,在这里记录一下, public class FixedScroller extends Scroller { ...
  • Ansionnal
  • Ansionnal
  • 2013-09-09 09:37
  • 6058

Android 自定义Viewpager滑动速度

由于Viewpager的滑动速度是固定的,所以很蛋疼。看了老外的文章可以利用反射机制,修改Viewpager的滑动速度。下面是代码实现:   需要新建个类FixedSpeedScoller继承自scroller类 import android.content.Context; import...
  • HellDevil
  • HellDevil
  • 2014-01-11 10:29
  • 11226

Android ViewPager 修改滑动速度

因为viewPager滑动速度太快而烦恼吗?用这个方法让viewPager的滑动掌控在你的手下:
  • yang786654260
  • yang786654260
  • 2015-07-15 17:23
  • 2530

android viewPager 滑动标题颜色渐变效果

由于项目需要用到这样的需求: 用户滑动界面的时候 上面的标题颜色也跟着渐渐的改变,类似于今日头条的效果 首先看一下效果先: 图片有点小 具体效果可以下载demo; 好了 现在开始!首先我们需要写一个了解一下需求: 1 需要写一个viewPager的标题 并且随手势滑动 2...
  • xielinhua88
  • xielinhua88
  • 2016-04-29 11:34
  • 1596

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

Viewpager自动轮播,间隔时间5秒: 如果五秒内用户没有手动滑动viewpager,则自动跳转到下一页 /** * 配置viewPager */ private ExecutorService mExecutorService = Executors.newCachedThreadP...
  • Dovar_66
  • Dovar_66
  • 2016-08-29 13:22
  • 2277

ViewPager循环滑动及自动播放

对于经常使用viewpager的人,应该清楚一般的viewpager在滑动到最右端或者最左端时,就不能继续往下滑动了,从用户的角度来看,这点的体验很不好,用户可能期待的是当我滑动到最后一页的时候,可以继续滑动,并滑动到第一页,所以我们需要实现viewpager的循环滑动。在网上也找了很多例子,基本上...
  • xingxing_yan
  • xingxing_yan
  • 2016-02-15 16:29
  • 1138

ViewPager实现图片的自动轮播和无限循环

在开发的时候想做个图片的轮播,在网上找了一些资料,发现不符合我个人的习惯,然后就自己写了个,还是直接贴上代码吧... DishDetailActivity.java import java.util.ArrayList; import java.util.HashMap; import java....
  • zhaowei_zhang
  • zhaowei_zhang
  • 2015-09-30 16:08
  • 2261

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

ViewPager以前有简单的用过,但没做过自动滚动和循环滚动,在实现起来还是有很多细节需要注意。总体思路:      1.实现循环滚动的思路就是:          &...
  • smbroe
  • smbroe
  • 2014-12-05 09:30
  • 2787
    个人资料
    • 访问:48552次
    • 积分:817
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:12篇
    • 译文:0篇
    • 评论:53条
    最新评论