Android----ViewPager的无限轮播

作者: pgydbh | 来源:发表于2018-06-10 12:06 被阅读61次

目录

无标题.png

思路

1.重写viewPage, 传入(一组view,间隔时间,一个现在所处位置改变事件)作为参数
2.用一个线程去管理viewpager的自己滑动
3.为了解决手势和自动的冲突,出现手势状态改变,就去处理线程。

代码

OnViewpagerChangeListener.java
public interface OnViewpagerChangeListener {

    void onChange(int currentPage);
}
ScrollerViewpager.java
public class ScrollerViewpager extends ViewPager {

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 100002)
                setCurrentItem(getCurrentItem() + 1);
        }
    };

    //滚动的页面
    private List<View> views;

    //滚动的页面数量
    private int count;

    //自动滚动信号
    private final int SCROLL = 100002;

    //创建一个滚动线程
    private Thread thread;

    //间隔时间
    private int SPACE;

    //目前线程状态
    private boolean NORMAL = true;

    public ScrollerViewpager(@NonNull Context context) {
        super(context);
    }

    public ScrollerViewpager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 功能:初始化
     * @param views 视图组
     * @param space 间隔时间
     * @param listener 监听事件
     */
    public void init(List<View> views, final int space, final OnViewpagerChangeListener listener){
        this.views = views;
        this.count = views.size();
        this.SPACE = space;

        setAdapter(new MyAdapter());
        setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % views.size());

        thread = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    try {
                        NORMAL = true;
                        Thread.sleep(SPACE * 1000);
                        handler.sendEmptyMessage(SCROLL);
                    } catch (InterruptedException e) {
                        try {
                            NORMAL = false;
                            Thread.sleep(Integer.MAX_VALUE);
                        } catch (InterruptedException e1) { }
                    }
                }
            }
        });
        thread.start();

        addOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                listener.onChange(position % count);
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                if ((!NORMAL && state != 1) || (NORMAL && state == 1)){
                    thread.interrupt();
                }
            }
        });
    }

    public class MyAdapter extends PagerAdapter{

        @Override
        public int getCount() {
            return Integer.MAX_VALUE;
        }

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

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            int temp = position % count;
            View view = views.get(temp);
            if (view.getParent() == container) {
                container.removeView(view);
            }
            container.addView(view);
            return view;
        }

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

使用方法

布局
<com.github.pgycode.scrollerviewpager.ScrollerViewpager
        android:layout_width="match_parent"
        android:id="@+id/viewpager"
        android:layout_height="300dp">

    </com.github.pgycode.scrollerviewpager.ScrollerViewpager>
java

public class MainActivity extends AppCompatActivity {

    private ScrollerViewpager viewpager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewpager = findViewById(R.id.viewpager);
        ArrayList<View> views = new ArrayList<>();
        views.add(LayoutInflater.from(this).inflate(R.layout.item, null,false));
        views.add(LayoutInflater.from(this).inflate(R.layout.item1, null,false));
        views.add(LayoutInflater.from(this).inflate(R.layout.item2, null,false));

        final Button btn1 = findViewById(R.id.button1);
        final Button btn2 = findViewById(R.id.button2);
        final Button btn3 = findViewById(R.id.button3);

        viewpager.init(views, 4, new OnViewpagerChangeListener() {
            @Override
            public void onChange(int currentPage) {
                switch (currentPage){
                    case 0:
                        btn1.setBackgroundColor(Color.YELLOW);
                        btn2.setBackgroundColor(Color.WHITE);
                        btn3.setBackgroundColor(Color.WHITE);
                        break;
                    case 1:
                        btn1.setBackgroundColor(Color.WHITE);
                        btn2.setBackgroundColor(Color.YELLOW);
                        btn3.setBackgroundColor(Color.WHITE);
                        break;
                    case 2:
                        btn1.setBackgroundColor(Color.WHITE);
                        btn2.setBackgroundColor(Color.WHITE);
                        btn3.setBackgroundColor(Color.YELLOW);
                        break;
                }
            }
        });
    }
}

demo

https://github.com/pgyCode/ScrollerViewpager

相关文章

  • Android----ViewPager的无限轮播

    目录 思路 1.重写viewPage, 传入(一组view,间隔时间,一个现在所处位置改变事件)作为参数2.用一个...

  • 4.6无限轮播

    无限轮播跟左右轮播还是有区别的.无限轮播就是自己无限的轮播下去.不经过人为的触发,不过它的原理还是与左边的距离为参...

  • 轮播图的制作

    这是渐变方法的无限轮播哈哈,附带autoPlay无缝无限轮播多个carouselcarousel-fullscreen

  • 收集一个很好用的无限轮播

    无限轮播

  • [iOS]定制性强的广告轮播图--SCAdView

    @[无限轮播图] @[3D轮播图] @[广告轮播图] SCAdView Statement If my code ...

  • Swift 无限轮播+自动无限轮播

    title: Swift Image browserdate: 2016-10-20 12:46:08catego...

  • Swift实现轮播图以及自定义UIPageControl

    无限轮播的实现思路 轮播图最核心的部分是如何实现无限轮播。我的实现方式是: 在UIScrollView上添加三个U...

  • Banner

    需求如下:(1)无限循环轮播(2)定时轮播(3)添加PageControl

  • 无限轮播

    demo轮播有好多种实现方法,当然,如果说是靠控制元素的隐藏消失和出现,这不算是轮播,轮播有种动起来的意思,就是要...

  • 无限轮播

    最近在准备毕业论文和毕业设计的事情,也是比较忙,许久未写博客了。之前一直想写一个自己的无限轮播,于是乎写出来和大家...

网友评论

    本文标题:Android----ViewPager的无限轮播

    本文链接:https://www.haomeiwen.com/subject/yuyfeftx.html