Android无限循环滚动ViewPager

在一般商城类app的主界面 顶部 都有一个 不停滚动的 广告栏,如图:



此 效果主要有   viewPager无限循环的 滚动,以及viewPager下标的改变

ViewPager下标可以看我另外一篇博客

viewPager下标


ViewPager循环 滚动思路主要如下:

        在ViewPager的数据源中  将首尾各自 添加尾首的数据 重新包裹旧数据

        当右滚动到 最后标号 1 条目时,马上跳转到数据源 第二个

        当左滚动到标号 3 条目时,马上跳转 数据源 第 4个


此方法 实现 要注意 几个地方:

1,ViewPager滚动 是有 动画效果的 ,当首尾跳转时,需调用 

setCurrentItem(int item, boolean smoothScroll) 

第一个为 跳转下标,第二个为 是否显示跳转动画

       2,ViewPager 首尾跳转 最好等 页面完成 加载后再 跳转,不然会有点视觉上的 卡顿

             

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

    }

    @Override
    public void onPageSelected(int position) {
        if (position == 0) {
            borderTag = true;
            borderJumpIndex = viewPager.getAdapter().getCount() - 2;
            viewPagerIndex.setCheckIndex(borderJumpIndex - 1);
        } else if (position == viewPager.getAdapter().getCount() - 1) {
            borderTag = true;
            borderJumpIndex = 1;
            viewPagerIndex.setCheckIndex(borderJumpIndex - 1);
        } else if (position < viewPager.getAdapter().getCount() - 1 && position > 0) {
            viewPagerIndex.setCheckIndex(position - 1);
            borderTag = false;
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        if (borderTag) {
            viewPager.setCurrentItem(borderJumpIndex, false);
        }
    }

对ViewPager设置PagerSelect监听, 在 onPageSelected 中 判断是否 需要跳转

        然后 在 onPagerScrollStateChanged 中 根据判断标志 执行跳转操作

3,ViewPager 下标 对应 改变的问题。 ViewPager在设置了PagerSelect监听 后,调用 setCurrentItem()  也会回调 onPageSelected 方法

              所以 应该在 onPageSelected中 改变 ViewPager 下标

实现自动滚动,触摸暂停

        需对 ViewPager设置 触摸监听,判断是否触摸,然后另外开一个线程每隔一段时间 发送 跳转指令

 @Override
    public boolean onTouch(View v, MotionEvent event) {
        viewPagerTouchTag = true;
        return false;
    }

 public void startLoop() {
        if (loopThread != null) {
            loopThread.interrupt();
        }
        loopThread = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try {
                        if (!viewPagerTouchTag) {
                            Thread.sleep(3000);
                            sendLoopMessage();
                        } else {
                            Thread.sleep(5000);
                            viewPagerTouchTag = false;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }


        };
        loopThread.start();
    }

    private void sendLoopMessage() {
        runHandler.sendEmptyMessage(1);
    }


 class RunHandler extends Handler {
        @Override
        public void handleMessage(Message msg) {
            if (viewPagerTouchTag) {
                return;
            }
            int currentItem = viewPager.getCurrentItem();
            if (currentItem < viewPager.getAdapter().getCount() - 1) {
                currentItem++;
            } else {
                currentItem = 0;
            }
            viewPager.setCurrentItem(currentItem);
        }
    }


代码下载地址: 点击打开链接
效果图:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值