BannerViewpager 实现广告轮播(定时轮播+手势滑动)

本文介绍了一种基于自定义ViewPager实现广告轮播的方法,支持定时自动翻页、动态添加图片及指示点,并实现了点击回调功能。代码中详细展示了如何使用Timer进行定时任务调度以及如何响应ViewPager的滑动事件。

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

通过自定义viewpager控件实现广告页效果,能够定时翻页,动态添加item和dot数量,并封装了点击回调,功能比较完善,使用简单。


定时滚动部分使用Timer这个类

/** 处理定时滚动任务 */
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if(listImgs.size() == 0)
                return;
           curIndex = (curIndex + 1)%listImgs.size();
            setCurrentItem(curIndex);
        }
    };

    /** 停止自动滚动任务 */
    public void stopTimer() {
        if (mTimer != null) {
            mTimer.cancel();
            mTimer = null;
        }
    }

    /** 开始自动滚动任务 图片大于1张才滚动 */
    public void startTimer() {
        if (mTimer == null && listImgs.size() > 1) {
            mTimer = new Timer();
            mTimer.schedule(new TimerTask() {
                public void run() {
                    handler.sendMessage(handler.obtainMessage(1));
                }
            }, scrollTime, scrollTime);
        }
    }

Timer的schedule方法来开始计时,需要传入3个参数1个TimerTask(其实是个runnable),和两个时间的参数分别表示延迟执行task的时间和每隔多少时间执行一次,timertask就是每次需要执行的工作。

此外,timertask并不是在主线程执行,所以无法直接修改ui,所以需要写个handler来执行滑动viewpager的操作


start方法是用来初始化image并开启viewpager的任务的。

1。两个list分别表示本地的图片和服务端的图片(title,url),在没网络,我们就加载本地图片

2.focuseId 就是小圆点显示的背景资源(它所关联的图片出于显示状态)

3.normalId 小圆点关联的图片出于隐藏状态 需要显示的背景资源

4.ovalLayout 指的是用来添加小圆点的布局,因为要根据图片资源的数量动态添加小圆点的数量

public void start(Context context, List<AdBean> list, List<AdBean> adsId, LinearLayout ovalLayout, int focusedId, int normalId){
        stopTimer();
        this.mContext = context;
        this.mUrllist = list;
        this.mAdsId = adsId;
        this.mOvalLayout = ovalLayout;
        this.mFocusedId = focusedId;
        this.mNormalId = normalId;
        this.curIndex = 0;

        init();
        initOvalLayout();
        ImagePaperAdapter adapter = new ImagePaperAdapter(listImgs);
        this.setAdapter(adapter);
        this.setCurrentItem(0);
        this.addOnPageChangeListener(new MyPageChangeListener(this));
        startTimer();
    }

private void init(){
        listImgs = new ArrayList<ImageView>(); // 图片组
        int len = mUrllist.size() != 0 ? mUrllist.size() : mAdsId.size();
        for (int i = 0; i < len; i++) {
            ImageView imageview = new ImageView(mContext); // 实例化ImageView的对象
            imageview.setScaleType(ImageView.ScaleType.FIT_XY); // 设置缩放方式
            imageview.setLayoutParams(new Gallery.LayoutParams( Gallery.LayoutParams.MATCH_PARENT, Gallery.LayoutParams.MATCH_PARENT));
            if (mUrllist.size() == 0) {// 本地加载图片
                imageview.setImageResource(Integer.valueOf(mAdsId.get(i).url)); // 为ImageView设置要显示的图片
                imageview.setScaleType(ImageView.ScaleType.CENTER_CROP);
            } else { // 网络加载图片
//                ImageLoader.getInstance().displayImage(mUrllist.get(i).getImageUrl(), imageview, ImageLoaderUtils.getOptions());
                imageview.setScaleType(ImageView.ScaleType.CENTER_CROP  );
            }
            final int imagePosition = i;
            imageview.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(onItemClickListener != null)
                        onItemClickListener.onItemClick(imagePosition);
                }
            });
            listImgs.add(imageview);
        }
    }

注:网络加载图片那部分代码注释掉了,大家根据自己需要添加

最后是滑动监听部分代码

private class MyPageChangeListener implements OnPageChangeListener{

        boolean isAutoPlay = false;
        private BannerViewPager bannerViewPager;

        public MyPageChangeListener(BannerViewPager bannerViewPager){
            this.bannerViewPager = bannerViewPager;
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub
            switch (arg0) {
                case 1:// 手势滑动,空闲中
                    isAutoPlay = false;
                    System.out.println(" 手势滑动,空闲中");
                    break;
                case 2:// 界面切换中
                    isAutoPlay = true;
                    stopTimer();
                    System.out.println(" 界面切换中");
                    break;
                case 0:// 滑动结束,即切换完毕或者加载完毕
                    if (bannerViewPager.getCurrentItem() == bannerViewPager.getAdapter().getCount() - 1 && !isAutoPlay) {
                        bannerViewPager.setCurrentItem(0);
                    }
                    else if (bannerViewPager.getCurrentItem() == 0 && !isAutoPlay) {
                        bannerViewPager.setCurrentItem(bannerViewPager.getAdapter().getCount() - 1);
                    }
                    System.out.println(" 当前界面 " + bannerViewPager.getCurrentItem());
                    startTimer();
                    break;
            }
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub
        }

        @Override
        public void onPageSelected(int pos) {
            // TODO Auto-generated method stub
            //这里面动态改变小圆点的被背景,来实现效果
            curIndex = pos;
            for(int i=0;i < listImgs.size();i++){
                mOvalLayout.getChildAt(i).setBackgroundResource(mNormalId); // 圆点取消
                if(i == curIndex)
                    mOvalLayout.getChildAt(curIndex).setBackgroundResource(mFocusedId);// 圆点选中
            }
        }

    }


项目地址:点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值