Android如何封装Banner控件

免费教程   2024年05月10日 22:08  

这篇文章主要介绍“Android如何封装Banner控件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android如何封装Banner控件”文章能帮助大家解决问题。

如上图所示效果我们应该都不陌生,这是一个简单的banner轮播效果,网上也有很多的开源项目,但有时候可能我们仅仅只需要一些简单的效果,并不需要其他过多的东西。这里简单的对banner进行一下封装,随时调用和添加一些新的功能。

代码展示/***Createdbyxiaolongon2018/1/23.*/publicclassBannerViewextendsFrameLayoutimplementsViewPager.OnPageChangeListener{privateViewPagerviewPager;//网络图片地址privateList<String>imageUrls;//指示点的容器privateLinearLayoutpointLayout;//当前页面位置privateintcurrentItem;//自动播放时间privateintautoPlayTime=2000;//是否自动播放privatebooleanisAutoPlay;//是否是一张图片privatebooleanisOneImage;//监听事件privateOnBannerItemClickonBannerItemClick;//这里利用handler实现循环播放privateHandlerhandler=newHandler(newHandler.Callback(){@OverridepublicbooleanhandleMessage(Messagemsg){currentItem++;currentItem=currentItem%(imageUrls.size()+2);viewPager.setCurrentItem(currentItem);handler.sendEmptyMessageDelayed(0,autoPlayTime);returnfalse;}});publicBannerView(@NonNullContextcontext){this(context,null);}publicBannerView(@NonNullContextcontext,@NullableAttributeSetattrs){this(context,attrs,0);}publicBannerView(@NonNullContextcontext,@NullableAttributeSetattrs,@AttrResintdefStyleAttr){super(context,attrs,defStyleAttr);TypedArraytypedArray=context.getTheme().obtainStyledAttributes(attrs,R.styleable.BannerView,0,0);//默认自动播放isAutoPlay=typedArray.getBoolean(R.styleable.BannerView_isAutoPlay,true);typedArray.recycle();viewPager=newViewPager(getContext());pointLayout=newLinearLayout(getContext());//添加监听事件viewPager.addOnPageChangeListener(this);//利用布局属性将指示器容器放置底部并居中FrameLayout.LayoutParamsparams=newFrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);params.gravity=Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL;params.bottomMargin=60;addView(viewPager);addView(pointLayout,params);}@OverridepublicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){}@OverridepublicvoidonPageSelected(intposition){currentItem=position;if(!isOneImage){switchToPoint(toRealPosition(position));}}@OverridepublicvoidonPageScrollStateChanged(intstate){//根据滑动松开后的状态,去判断当前的current并跳转到指定currentif(state==ViewPager.SCROLL_STATE_IDLE){intcurrent=viewPager.getCurrentItem();intlastReal=viewPager.getAdapter().getCount()-2;if(current==0){viewPager.setCurrentItem(lastReal,false);}elseif(current==lastReal+1){viewPager.setCurrentItem(1,false);}}}//配置viewpager适配器privateclassBannerAdapterextendsPagerAdapter{@OverridepublicintgetCount(){returnimageUrls.size()+2;}@OverridepublicbooleanisViewFromObject(Viewview,Objectobject){returnview==object;}@OverridepublicObjectinstantiateItem(ViewGroupcontainer,finalintposition){ImageViewimageView=newImageView(getContext());imageView.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){if(onBannerItemClick!=null){onBannerItemClick.onItemClick(toRealPosition(position));}}});imageView.setScaleType(ImageView.ScaleType.FIT_XY);Glide.with(getContext()).load(imageUrls.get(toRealPosition(position))).into(imageView);container.addView(imageView);returnimageView;}@OverridepublicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){container.removeView((View)object);}}//添加网络图片publicvoidsetImageUrls(List<String>imageUrls){this.imageUrls=imageUrls;if(imageUrls.size()<=1){isOneImage=true;}else{isOneImage=false;}initViewPager();}//加载viewPagerprivatevoidinitViewPager(){if(!isOneImage){//添加指示点addPoints();}BannerAdapteradapter=newBannerAdapter();viewPager.setAdapter(adapter);//默认当前图片viewPager.setCurrentItem(1);//判断是否自动播放和是否是一张图片的情况if(isAutoPlay&&!isOneImage){handler.sendEmptyMessageDelayed(0,autoPlayTime);}}//添加指示点privatevoidaddPoints(){LinearLayout.LayoutParamslp=newLinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);lp.setMargins(10,10,10,10);ImageViewimageView;intlength=imageUrls.size();for(inti=0;i<length;i++){imageView=newImageView(getContext());imageView.setLayoutParams(lp);imageView.setImageResource(R.drawable.select_point_bg);pointLayout.addView(imageView);}switchToPoint(0);}//切换指示器privatevoidswitchToPoint(intcurrentPoint){for(inti=0;i<pointLayout.getChildCount();i++){pointLayout.getChildAt(i).setEnabled(false);}pointLayout.getChildAt(currentPoint).setEnabled(true);}//返回真实的位置privateinttoRealPosition(intposition){intrealPosition;if(imageUrls.size()>0){realPosition=(position-1)%imageUrls.size();if(realPosition<0)realPosition+=imageUrls.size();}else{realPosition=0;}returnrealPosition;}publicvoidsetAutoPlay(booleanautoPlay){isAutoPlay=autoPlay;}publicvoidsetOnBannerItemClick(OnBannerItemClickonBannerItemClick){this.onBannerItemClick=onBannerItemClick;}//添加监听事件回调publicinterfaceOnBannerItemClick{voidonItemClick(intposition);}}调用方式//设置是否自动播放bannerView.setAutoPlay(true);//添加网络图片bannerView.setImageUrls(data);//banner的点击事件bannerView.setOnBannerItemClick(newBannerView.OnBannerItemClick(){@OverridepublicvoidonItemClick(intposition){Toast.makeText(MainActivity.this,"图片"+position,Toast.LENGTH_LONG).show();}});代码分析

这里我只考虑了使用网络图片进行展示,使用本地图片原理是一样的,在里面多加个方法即可。此效果代码不是很复杂,通俗易懂。唯一值得一说的是我在实现viewpager无限滑动时采用的是return imageUrls.size() + 2的方法。这里我们添加两条数据分别为第一条和最后一条。第一条代表着最后一张图片而最后一条则代表着第一张图片。

通过此图我们应该不难发现,当我们滑动到第二个0的时候则跳转到第一个0,滑动到第一个2的时候则跳转到第二个2。这里0代表第一张图片,2代表第二张图片。这样就可以实现无限滑动的效果了,可能有些人会觉得这样做有些复杂还要判断真实的位置不如直接将getConut()返回一个最大值然后取其中间值即可。但这样做其实代码性能并不是很高。

关于“Android如何封装Banner控件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部