您的位置:首页 > 移动开发 > Android开发

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

2016-06-30 14:19 405 查看

通过自定义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);// 圆点选中
}
}

}

项目地址:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息