广告轮播控件ImageBanner简单封装

广告轮播控件ImageBanner简单封装

主要是对项目中的广告轮播做一个简单的封装。

具体思路如下:
1.继承FrameLayout,添加ViewPager和PageIndicator
2.使用LoopViewPager实现无限轮播
3.使用Handler来实现自动轮播

1.简单使用及提供的接口

使用方式很简单,将数据传进banner中即可。

banner.setViewData(array);

开启或者关闭自动轮播。

/**

* 开启&关闭自动轮播

*/public void startLoop(boolean flag){


    if (flag){



        if (mHandler == null){



           mHandler = new ImageHandler(this);


        }


        mHandler.sendEmptyMessageDelayed(ImageHandler.UPDATE_IMAGE, ImageHandler.TIME_DELAY);



    }else {



        if (mHandler != null){


          mHandler.stopAllAction();

          mHandler.removeMessages(ImageHandler.KEEP_STILL);

          mHandler = null;

        }

}

2.无限轮播:使用LoopViewPager

想要ViewPager实现无限循环,原理基本上有两种:
- 1.将getCount设置为无限大或者一个很大的数(这种方式使用的比较多)
- 2.getCount设置为实际数目+2
LoopViewPager运用的是第二种原理,并且已经封装好了,直接使用即可。
具体参考:
LoopViewPager

3.自动轮播:使用Handler

  private static class ImageHandler extends Handler {
        /**
         * message to update viewpager
         */
        protected static final int UPDATE_IMAGE = 1;

        /**
         * message to keep viewpager still
         */
        protected static final int KEEP_STILL = 2;

        /**
         * message to change the current page
         */
        protected static final int CHANGE_PAGE = 3;

        //change speed
        protected static final int TIME_DELAY = 5000;

        private WeakReference<ImageBanner> weakReference;
        private int currentItem = 0;

        private boolean isStop = false;

        protected ImageHandler(ImageBanner banner) {
            weakReference = new WeakReference<>(banner);
            isStop = false;
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            ImageBanner banner = weakReference.get();
            if (banner == null || banner.mViewPager == null || banner.mViewPager.getAdapter() == null || isStop) {
                return;
            }
            //当用户拖拽时,停止自动更新
            if (banner.mHandler.hasMessages(UPDATE_IMAGE)) {
                banner.mHandler.removeMessages(UPDATE_IMAGE);
            }
            switch (msg.what) {
                case UPDATE_IMAGE:
                    currentItem++;
                    banner.mViewPager.setCurrentItem(currentItem);
                    break;
                case KEEP_STILL:
                    break;
                case CHANGE_PAGE:
                    currentItem = msg.arg1;
                    banner.mHandler.sendEmptyMessageDelayed(UPDATE_IMAGE, TIME_DELAY);
                    break;
            }
        }

        public void stopAllAction() {
            isStop = true;
        }
    }

设置startLoop(true)后,handler发送延时消息,开启自动循环。

mHandler.sendEmptyMessageDelayed(ImageHandler.UPDATE_IMAGE, ImageHandler.TIME_DELAY);

ImageHandler中有一点需要注意就是使用WeakReference来避免泄露。


Reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值