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;
}
}