Viewpager--无限循环新闻banner图(支持手动和自动)

本文介绍了一种在Android中利用ViewPager实现图片无限循环滑动的方法。通过前后添加虚拟图片,结合OnPageChangeListener监听器,实现了平滑过渡效果,解决了快速滑动时出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

viewpager在实现自动播放时,比较容易。现在需要加入手动无限循环。如下图:
新闻banner图

网上一般代码都会存在一定问题,并不能非常流畅。大M现修正并上传源码供大家使用。下面说说简单的实现和注意地方。加载图片用了ImageCacheLoader,可以任意替换如glide等其他第三方图片加载。

为了无缝显示图片,存储图片的时候才用如下思想:
- 若共5张图片:ABCDE,则保存图片list的时候需要这样保存EABCDEA

/**
     * 如果图片大于1则进行前后各加1个图片的处理,imageurls为真实图片地址。
     * */
    private void getModifyUriList(ArrayList<String> imageurls) {

        int length = uriList.size();
        if (length > 1) {
            uriList.add(0, uriList.get(length - 1));
            uriList.add(length + 1, uriList.get(1));
        }

    }
  • 接着就是要实现OnPageChangeListener接口,onPageScrollStateChanged的三个状态,网上说的大部分都是错的解释,建议查看手册。
class MyOnPageChangeListener implements OnPageChangeListener {
            int oldPosition = 0;@Override
        public void onPageSelected(int position) {
            currentItem = position;
            if (title != null && titles != null) {
                title.setText(titles[position]);
            }

            if (dots != null && dots.size() > 0) {

                if (position == 1 || position == getAdapter().getCount() - 1) {
                    // 如果是第一图片被选中,则就将第一个点显示红
                    dots.get(oldPosition).setBackgroundResource(
                            dot_normal_resId);
                    dots.get(1).setBackgroundResource(dot_focus_resId);

                } else if (position == 0
                        || position == getAdapter().getCount() - 2) {
                    // 如果是最后一个图片被选中,则就将最后一个图片点显示红
                    dots.get(oldPosition).setBackgroundResource(
                            dot_normal_resId);
                    dots.get(getAdapter().getCount() - 2)
                            .setBackgroundResource(dot_focus_resId);
                } else {

                    dots.get(position).setBackgroundResource(dot_focus_resId);
                    dots.get(oldPosition).setBackgroundResource(
                            dot_normal_resId);
                }

            }
            oldPosition = position;
        }

        /** onPageScrollStateChanged方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。 */
        @Override
        public void onPageScrollStateChanged(int arg0) {

            switch (arg0) {
            case 1:// 手势滑动,如果这里不设置,快速滑动的时候会有问题,可自行注释后测试
                    // 当前为最后一张,此时从右向左滑,则切换到第一张
                if (getCurrentItem() == getAdapter().getCount() - 1) {
                    setCurrentItem(1, false);
                }
                // 当前为第一张,此时从左向右滑,则切换到最后一张
                else if (getCurrentItem() == 0) {
                    setCurrentItem(getAdapter().getCount() - 2, false);
                }
                break;
            case 2:
                break;
            case 0:// 滑动结束,即切换完毕或者加载完毕
                    // 当前为最后一张,此时从右向左滑,则切换到第一张
                if (getCurrentItem() == getAdapter().getCount() - 1) {
                    setCurrentItem(1, false);
                }
                // 当前为第一张,此时从左向右滑,则切换到最后一张
                else if (getCurrentItem() == 0) {
                    setCurrentItem(getAdapter().getCount() - 2, false);
                }

                break;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }
        }

Demo下载地址:http://download.youkuaiyun.com/detail/minkex/9243413

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值