ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示
上一张效果图: 之前的项目有一个Galley的项目,但是代码结构特别乱,别问我为什么,我也是刚接手这个项目,为了方便以后阅读和维护我对一些模块进行了重构。ViewPager实现Galler效果,但是当时时间比较急,写的比较仓促,上一篇实现了简单的效果,但是对于初始的时候左边滑动是有问题的,这是因为我们在自己的Adapter的时候对于getCount,我们想通过Integer.MAX_VALUE来实现无限循环,简单的说这个是向右(无限大)吧,所以也就只是实现了向右的循环,对于像左的还是不行的。 那么怎么解决呢? 首先我们对Adapter还是需要按以前的写法,其实Adapter适配器就是帮我们做界面的,其他的逻辑最好不要加,我之前的想法是用过 viewPager.addOnPageChangeListener来实现,通过判断是否滑到最左边或者最右边来实现循环滑到。 [html] view plain copy print ? intrealPosition=mAdapter.toRealPosition(position); if(mPreviousPosition!=realPosition){ mPreviousPosition=realPosition; if(mOuterPageChangeListener!=null){ mOuterPageChangeListener.onPageSelected(realPosition); } } 这里我封装了一个类,只要将你的ViewPager改为我封装好的ViewPager就行 LoopViewPager [html] view plain copy print ? publicclassLoopViewPagerextendsViewPager{ privatestaticfinalbooleanDEFAULT_BOUNDARY_CASHING=false; privateOnPageChangeListenermOuterPageChangeListener; privateLoopPagerAdapterWrappermAdapter; privatebooleanmBoundaryCaching=DEFAULT_BOUNDARY_CASHING; publicstaticinttoRealPosition(intposition,intcount){ position=position-1; if(position<0){ position+=count; }else{ position=position%count; } returnposition; } publicvoidsetBoundaryCaching(booleanflag){ mBoundaryCaching=flag; if(mAdapter!=null){ mAdapter.setBoundaryCaching(flag); } } @Override publicvoidsetAdapter(PagerAdapteradapter){ mAdapter=newLoopPagerAdapterWrapper(adapter); mAdapter.setBoundaryCaching(mBoundaryCaching); super.setAdapter(mAdapter); setCurrentItem(0,false); } @Override publicPagerAdaptergetAdapter(){ returnmAdapter!=null?mAdapter.getRealAdapter():mAdapter; } @Override publicintgetCurrentItem(){ returnmAdapter!=null?mAdapter.toRealPosition(super.getCurrentItem()):0; } publicvoidsetCurrentItem(intitem,booleansmoothScroll){ intrealItem=mAdapter.toInnerPosition(item); super.setCurrentItem(realItem,smoothScroll); } @Override publicvoidsetCurrentItem(intitem){ if(getCurrentItem()!=item){ setCurrentItem(item,true); } } @Override publicvoidsetOnPageChangeListener(OnPageChangeListenerlistener){ mOuterPageChangeListener=listener; }; publicLoopViewPager(Contextcontext){ super(context); init(); } publicLoopViewPager(Contextcontext,AttributeSetattrs){ super(context,attrs); init(); } privatevoidinit(){ super.setOnPageChangeListener(onPageChangeListener); } privateOnPageChangeListeneronPageChangeListener=newOnPageChangeListener(){ privatefloatmPreviousOffset=-1; privatefloatmPreviousPosition=-1; @Override publicvoidonPageSelected(intposition){ intrealPosition=mAdapter.toRealPosition(position); if(mPreviousPosition!=realPosition){ mPreviousPosition=realPosition; if(mOuterPageChangeListener!=null){ mOuterPageChangeListener.onPageSelected(realPosition); } } } @Override publicvoidonPageScrolled(intposition,floatpositionOffset, intpositionOffsetPixels){ intrealPosition=position