Android使用ViewPager做无限轮播,人为滑动时停止

简介: Android使用ViewPager做无限轮播,人为滑动时停止

实现无限循环

使用取模,获取到当前图片所在的位置。

    private class MyPagerAdapter extends PagerAdapter {
        private Context context;
        List<ImageView> list;

        public MyPagerAdapter(Context context, List<ImageView> list) {
            this.context = context;
            this.list = list;
        }

        @Override
        public int getCount() {
            //使用Integer的最大值,这样基本上就不需要滑动到最后了
            //除非用户很蛋疼
            return Integer.MAX_VALUE;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            //当前位置模上总数等于图片在数组中的位置
            position %= list.size();
            if (position < 0) {
                position = list.size() + position;
            }
            ImageView imageView = list.get(position);
            //设置轮播点击事件
            final int finalPosition = position;
            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getApplicationContext(), BannerActivity.class);
                    intent.putExtra("position", finalPosition);
                    startActivity(intent);
                }
            });
            ViewGroup parent = (ViewGroup) imageView.getParent();
            if (parent != null) {
                parent.removeView(imageView);
            }
            container.addView(imageView);
            return list.get(position);
        }

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

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            //注意这里不要使用
            //container.removeView(list.get(position));
        }
    }

自动循环实现

使用Handler每隔5秒一次消息,接收到轮播的动作就继续发一次消息,实现自动轮播的效果。

    private class MyHandler extends Handler {
        private Context context;
        //使用弱引用,避免handler造成内存泄露
        private WeakReference<MainActivity> weakReference;

        public MyHandler(WeakReference<MainActivity> weakReference) {
            this.weakReference = weakReference;
        }


        @Override
        public void handleMessage(Message msg) {
            MainActivity activity = weakReference.get();
            //Activity不存在了,就不需要再处理了
            if (activity == null) {
                return;
            }
            //如果已经有消息了,先移除消息
            if (activity.handler.hasMessages(BANNER_NEXT)) {
                activity.handler.removeMessages(BANNER_NEXT);
            }
            switch (msg.what) {
                case BANNER_NEXT:
                    //跳到下一页,
                    int currentItem = vpBanner.getCurrentItem();
                    activity.vpBanner.setCurrentItem(++currentItem);
                    //5秒后继续轮播
                    activity.handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
                    break;
                case BANNER_PAUSE:
                    //暂停,不需要做任务操作
                    break;
                case BANNER_RESUME:
                    //继续轮播
                    activity.handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
                    break;
            }
        }
    }

在Activity中使用

        //这里放了3张图片,使用Gilde加载
        ImageView imageView1 = new ImageView(this);
        ImageView imageView2 = new ImageView(this);
        ImageView imageView3 = new ImageView(this);
        RequestManager requestManager = Glide.with(this);
        requestManager.load("http://img1.imgtn.bdimg.com/it/u=3251910782,1174316217&fm=21&gp=0.jpg").into(imageView1);
        requestManager.load("http://pic2.ooopic.com/10/78/50/34b1OOOPICf0.jpg").into(imageView2);
        requestManager.load("http://www.swkweike.com/data/uploads/2015/08/18/193226787255d2dbd711a33.jpg").into(imageView3);
        List<ImageView> list = new ArrayList<>();
        list.add(imageView1);
        list.add(imageView2);
        list.add(imageView3);
        MyPagerAdapter adapter = new MyPagerAdapter(this, list);
        vpBanner = (ViewPager) findViewById(R.id.vpBanner);
        vpBanner.setAdapter(adapter);
        //将起始位置设置在中间,让用户看不到边界
        vpBanner.setCurrentItem(Integer.MAX_VALUE / 2);
        //开始轮播
        handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);

用户滑动时停止轮播,松开时继续轮播

使用ViewPager的滑动监听事件,判断用户是否正在滑动

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

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {
                switch (state) {
                    case ViewPager.SCROLL_STATE_DRAGGING:
                        //用户正在滑动,暂停轮播
                        handler.sendEmptyMessage(BANNER_PAUSE);
                        break;
                    case ViewPager.SCROLL_STATE_IDLE:
                        //滑动结束,继续轮播
                        handler.sendEmptyMessageDelayed(BANNER_NEXT, 5000);
                        break;
                }

            }
        });
相关文章
|
7月前
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
251 0
|
6月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
64 3
|
5月前
|
Android开发
Android仿高德首页三段式滑动
Android仿高德首页三段式滑动
165 0
|
6月前
|
编解码 Android开发
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
Android 解决TextView多行滑动与NestedScrollView嵌套滑动冲突的问题
111 0
|
7月前
|
Android开发
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
|
6月前
|
XML Android开发 UED
|
7月前
|
Android开发 Kotlin 索引
Android Compose——ScrollableTabRow和LazyColumn同步滑动
Android Compose——ScrollableTabRow和LazyColumn同步滑动
336 0
|
Android开发
关于Android ViewPager禁止滑动
ViewPager默认是可以手动切换的,实现自动切换,可以通过定时器来完成,而有些时候,我们是需要禁止ViewPager手动切换的, 这个时候就需要自定义ViewPager了,其实也很简单,原理就是拦截触摸事件,让ViewPager不处理onTouch事件,直接交给他的子控件去处理就行。
309 0
|
19天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19
|
19天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
44 14