java制作广告图片自动轮播控件
首页图片的轮播
/** *广告图片自动轮播控件</br> * */ publicclassImageCycleViewextendsLinearLayout{ /** *上下文 */ privateContextmContext; /** *图片轮播视图 */ privateViewPagermAdvPager=null; /** *滚动图片视图适配 */ privateImageCycleAdaptermAdvAdapter; /** *图片轮播指示器控件 */ privateViewGroupmGroup; /** *图片轮播指示个图 */ privateImageViewmImageView=null; /** *滚动图片指示视图列表 */ privateImageView[]mImageViews=null; /** *图片滚动当前图片下标 */ privatebooleanisStop; /** *游标是圆形还是长条,要是设置为0是长条,要是1就是圆形默认是圆形 */ publicintstype=1; /** *@paramcontext */ publicImageCycleView(Contextcontext){ super(context); } /** *@paramcontext *@paramattrs */ @SuppressLint("Recycle") publicImageCycleView(Contextcontext,AttributeSetattrs){ super(context,attrs); mContext=context; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view,this); mAdvPager=(ViewPager)findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(newGuidePageChangeListener()); //滚动图片右下指示器视 mGroup=(ViewGroup)findViewById(R.id.viewGroup); } /** *触摸停止计时器,抬起启动计时器 */ @Override publicbooleandispatchTouchEvent(MotionEventevent){ if(event.getAction()==MotionEvent.ACTION_UP){ //开始图片滚动 startImageTimerTask(); }else{ //停止图片滚动 stopImageTimerTask(); } returnsuper.dispatchTouchEvent(event); } /** *装填图片数据 * *@paramimageUrlList *@paramimageCycleViewListener */ publicvoidsetImageResources(ArrayList<Integer>imageUrlList,ImageCycleViewListenerimageCycleViewListener,intstype){ this.stype=stype; //清除 mGroup.removeAllViews(); //图片广告数量 finalintimageCount=imageUrlList.size(); mImageViews=newImageView[imageCount]; for(inti=0;i<imageCount;i++){ mImageView=newImageView(mContext); LayoutParamsparams=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); params.leftMargin=30; mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i]=mImageView; if(i==0){ if(this.stype==1) //mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//换点 else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); }else{ if(this.stype==1) //mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]); } mAdvAdapter=newImageCycleAdapter(mContext,imageUrlList,imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } publicvoidsetImageResources2(ArrayList<Integer>imageUrlList,ImageCycleViewListenerimageCycleViewListener,intstype){ this.stype=stype; //清除 mGroup.removeAllViews(); //图片广告数量 finalintimageCount=imageUrlList.size(); mImageViews=newImageView[imageCount]; for(inti=0;i<imageCount;i++){ mImageView=newImageView(mContext); LayoutParamsparams=newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); params.leftMargin=30; mImageView.setScaleType(ScaleType.CENTER_CROP); mImageView.setLayoutParams(params); mImageViews[i]=mImageView; if(i==0){ if(this.stype==1) //mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//换点 else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); }else{ if(this.stype==1) //mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } mGroup.addView(mImageViews[i]); } mAdvAdapter=newImageCycleAdapter(mContext,imageUrlList,imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); startImageTimerTask(); } /** *图片轮播(手动控制自动轮播与否,便于资源控件) */ publicvoidstartImageCycle(){ startImageTimerTask(); } /** *暂停轮播—用于节省资源 */ publicvoidpushImageCycle(){ stopImageTimerTask(); } /** *图片滚动任务 */ privatevoidstartImageTimerTask(){ stopImageTimerTask(); //图片滚动 mHandler.postDelayed(mImageTimerTask,5000); } /** *停止图片滚动任务 */ privatevoidstopImageTimerTask(){ isStop=true; mHandler.removeCallbacks(mImageTimerTask); } privateHandlermHandler=newHandler(); /** *图片自动轮播Task */ privateRunnablemImageTimerTask=newRunnable(){ @Override publicvoidrun(){ if(mImageViews!=null){ mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); if(!isStop){//ifisStop=true//当你退出后要把这个给停下来不然这个一直存在就一直在后台循环 mHandler.postDelayed(mImageTimerTask,5000); } } } }; /** *轮播图片监听 * *@authorminking */ privatefinalclassGuidePageChangeListenerimplementsOnPageChangeListener{ @Override publicvoidonPageScrollStateChanged(intstate){ if(state==ViewPager.SCROLL_STATE_IDLE) startImageTimerTask(); } @Override publicvoidonPageScrolled(intarg0,floatarg1,intarg2){ } @Override publicvoidonPageSelected(intindex){ index=index%mImageViews.length; //设置当前显示的图片 //设置图片滚动指示器背 if(stype!=1) mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); else mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); for(inti=0;i<mImageViews.length;i++){ if(index!=i){ if(stype!=1) mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); else mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); } } } } privateclassImageCycleAdapterextendsPagerAdapter{ /** *图片视图缓存列表 */ privateArrayList<SmartImageView>mImageViewCacheList; /** *图片资源列表 */ //privateArrayList<String>mAdList=newArrayList<String>(); privateArrayList<Integer>mAdList=newArrayList<Integer>(); /** *广告图片点击监听 */ privateImageCycleViewListenermImageCycleViewListener; privateContextmContext; //publicImageCycleAdapter(Contextcontext,ArrayList<String>adList,ImageCycleViewListenerimageCycleViewListener){ //this.mContext=context; //this.mAdList=adList; //mImageCycleViewListener=imageCycleViewListener; //mImageViewCacheList=newArrayList<SmartImageView>(); //} publicImageCycleAdapter(Contextcontext,ArrayList<Integer>adList,ImageCycleViewListenerimageCycleViewListener){ this.mContext=context; this.mAdList=adList; mImageCycleViewListener=imageCycleViewListener; mImageViewCacheList=newArrayList<SmartImageView>(); } @Override publicintgetCount(){ returnInteger.MAX_VALUE; } @Override publicbooleanisViewFromObject(Viewview,Objectobj){ returnview==obj; } @Override publicObjectinstantiateItem(ViewGroupcontainer,finalintposition){ intimageUrl=mAdList.get(position%mAdList.size()); Log.e("imageUrl:",position%mAdList.size()+"--"+imageUrl+""); SmartImageViewimageView=null; if(mImageViewCacheList.isEmpty()){ imageView=newSmartImageView(mContext); imageView.setLayoutParams(newLayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); //test imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); } else{ imageView=mImageViewCacheList.remove(0); } imageView.setTag(imageUrl); container.addView(imageView); //imageView.setImageUrl(imageUrl); imageView.setBackgroundResource(imageUrl); //设置图片点击监听 imageView.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ mImageCycleViewListener.onImageClick(position%mAdList.size(),v); } }); returnimageView; } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ SmartImageViewview=(SmartImageView)object; mAdvPager.removeView(view); mImageViewCacheList.add(view); } } /** *轮播控件的监听事件 * *@authorminking */ publicstaticinterfaceImageCycleViewListener{ /** *单击图片事件 * *@paramposition *@paramimageView */ publicvoidonImageClick(intposition,ViewimageView); } }
我们再来看个基于安卓ViewPager的图片轮播控件
packageme.lanfog.myandroid.widget; importjava.util.ArrayList; importjava.util.List; importandroid.content.Context; importandroid.os.Handler; importandroid.os.Message; importandroid.support.v4.view.PagerAdapter; importandroid.support.v4.view.ViewPager; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.ImageView; publicclassPageFlipperextendsViewPager{ privateStringTAG=PageFlipper.class.getSimpleName(); privateList<View>views; privatePagerAdapteradapter=newPagerAdapter(){ @Override publicObjectinstantiateItem(ViewGroupcontainer,intposition){ Viewv=views.get(position); container.addView(v); returnv; } @Override publicbooleanisViewFromObject(Viewarg0,Objectarg1){ returnarg0==arg1; } @Override publicintgetItemPosition(Objectobject){ returnviews.indexOf(object); } @Override publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){ container.removeView((View)object); } @Override publicintgetCount(){ returnviews==null?0:views.size(); } }; privateOnPageChangeListenerlistener=newOnPageChangeListener(){ /** *将控件位置转化为数据集中的位置 */ publicintconvert(intposition){ returnposition==0?views.size()-1:(position>views.size()?0:position-1); } @Override publicvoidonPageSelected(intposition){ if(listener2!=null){ listener2.onPageSelected(convert(position)); } } @Override publicvoidonPageScrolled(intposition,floatpercent,intoffset){ if(listener2!=null){ listener2.onPageScrolled(convert(position),percent,offset); } if(percent==0){ if(position==0)//切换到倒数第二页 setCurrentItem((views.size()-2)%views.size(),false); elseif(position==views.size()-1)//切换到正数第二页 setCurrentItem(1,false); } } @Override publicvoidonPageScrollStateChanged(intstate){ if(listener2!=null){ listener2.onPageScrollStateChanged(state); } switch(state){ caseSCROLL_STATE_IDLE://闲置 if(!handler.hasMessages(START_FLIPPING)) handler.sendEmptyMessageDelayed(START_FLIPPING,3000);//延时滚动 break; caseSCROLL_STATE_DRAGGING://拖动中 handler.sendEmptyMessage(STOP_FLIPPING);//取消滚动 break; caseSCROLL_STATE_SETTLING://拖动结束 break; } } },listener2; privatefinalintSTART_FLIPPING=0; privatefinalintSTOP_FLIPPING=1; privateHandlerhandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ switch(msg.what){ caseSTART_FLIPPING: if(views.size()>3)//因为前后页是辅助页,所以此处3也就是只有1页 setCurrentItem((getCurrentItem()+1)%views.size()); handler.sendEmptyMessageDelayed(START_FLIPPING,3000);//延时滚动 break; caseSTOP_FLIPPING: handler.removeMessages(START_FLIPPING); break; } } }; publicPageFlipper(Contextcontext,AttributeSetattrs){ super(context,attrs); init(); } publicPageFlipper(Contextcontext){ super(context); init(); } privatevoidinit(){ setOffscreenPageLimit(1);//最大页面缓存数量 setAdapter(adapter);//适配器 super.setOnPageChangeListener(listener);//监听器 handler.sendEmptyMessageDelayed(START_FLIPPING,3000);//延时滚动 } publicvoidsetViews(int[]ids){ this.views=newArrayList<View>(); for(inti=0;i<ids.length+2;i++){//头部新增一个尾页,尾部新增一个首页 ImageViewiv=newImageView(getContext()); iv.setImageResource(ids[i==0?ids.length-1:(i>ids.length?0:i-1)]); iv.setScaleType(ImageView.ScaleType.FIT_XY); this.views.add(iv); } setCurrentItem(1);//首页 this.adapter.notifyDataSetChanged(); } @Override publicvoidsetOnPageChangeListener(OnPageChangeListenerlistener){ this.listener2=listener; } }