广告轮播控件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
来避免泄露。