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);// 圆点选中
}
}
}
项目地址:点击打开链接
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories