实现原理
使用ViewPager简单实现循环播放多个广告图片的banner效果,利用Handler与Runnable配合实现指定功能模块的定时循环执行。
实现效果
实现过程
- 首先定义并初始化Viewpager控件,为其设置适配器,这个都是老生常谈了。
private void initBanner(ViewPager banner, int[] resArray) {
List<View> viewList = new ArrayList<>();
for (Integer res : resArray) {
ImageView imageView = (ImageView) LayoutInflater.from(this).inflate(R.layout.banner_item, banner, false);
imageView.setImageResource(res);
viewList.add(imageView);
}
BannerAdapter bannerAdapter = new BannerAdapter(this, viewList);
banner.setOffscreenPageLimit(5);
banner.setAdapter(bannerAdapter);
}
- 接下来我们定义一个handler
private Handler mHandler = new Handler();
- 然后将ViewPager图片轮播逻辑封装在Runnable中,实现图片自动切换和循环翻页
private Runnable mAutoSwitchRunnable = new Runnable() {
@Override
public void run() {
if (mBannerViewPager == null) {
mHandler.removeCallbacksAndMessages(null);
return;
}
int itemCount = mBannerViewPager.getChildCount();
if (itemCount > 0) {
int currentItem = mBannerViewPager.getCurrentItem();
int nextItem = (currentItem + 1) % itemCount;
mBannerViewPager.setCurrentItem(nextItem);
}
mHandler.postDelayed(this, 4000);
}
};
- 最后,你希望在哪里开始这种循环,就在哪个位置加入这段代码即可。
mHandler.postDelayed(mAutoSwitchRunnable, 4000);
此处,我们希望当前Activity一显示,就开始呈现banner效果,所以我们在onCreate方法里添加这句代码。
注意:
- postDelayed中的4s表示程序运行到此处延迟四秒开启这个handler,而Runnable中的4s表示每隔4秒执行一次图片切换。
- 为了避免内存泄漏、空指针等异常,当banner所在的Activity处于不可见时,我们需要清空消息队列,调用在onStop方法里执行这句代码即可:
@Override
protected void onStop() {
destroy();
super.onStop();
}
private void destroy() {
mHandler.removeCallbacksAndMessages(null);
}