Android编程实现ListView头部ViewPager广告轮询图效果
本文实例讲述了Android编程实现ListView头部ViewPager广告轮询图效果。分享给大家供大家参考,具体如下:
之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下。
1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下:
packagecom.example.testa; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.view.MotionEvent; importandroid.widget.ListView; publicclassDefinedListViewextendsListView{ publicDefinedListView(Contextcontext){ super(context); } publicDefinedListView(Contextcontext,AttributeSetattrs){ super(context,attrs); } publicDefinedListView(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); } privatefloatxDistance,yDistance,xLast,yLast; @Override publicbooleanonInterceptTouchEvent(MotionEventev){ switch(ev.getAction()){ caseMotionEvent.ACTION_DOWN: xDistance=yDistance=0f; xLast=ev.getX(); yLast=ev.getY(); break; caseMotionEvent.ACTION_MOVE: finalfloatcurX=ev.getX(); finalfloatcurY=ev.getY(); xDistance+=Math.abs(curX-xLast); yDistance+=Math.abs(curY-yLast); xLast=curX; yLast=curY; if(xDistance>yDistance){ returnfalse; } } returnsuper.onInterceptTouchEvent(ev); } }
2、为了让广告轮询的速度减慢,必须重新设置ViewPager的Scroller,自定义的Scroller如下:
packagecom.example.testa; importjava.lang.reflect.Field; importandroid.annotation.SuppressLint; importandroid.content.Context; importandroid.os.Handler; importandroid.support.v4.app.FragmentActivity; importandroid.support.v4.view.ViewPager; importandroid.view.LayoutInflater; importandroid.view.MotionEvent; importandroid.view.View; importandroid.view.View.OnTouchListener; importandroid.view.animation.Interpolator; importandroid.widget.Scroller; publicclassDefinedScrollerextendsScroller{ privateintDURATION_TIME=1000; privatebooleanshouldAutoScroll=true; privateViewPagerviewPager=null; @SuppressLint("HandlerLeak") privatefinalHandlerhandler=newHandler(){ publicvoidhandleMessage(android.os.Messagemsg){ if(shouldAutoScroll){ viewPager.setCurrentItem(viewPager.getCurrentItem()+1); handler.sendEmptyMessageDelayed(0,2000); } }; }; publicDefinedScroller(Contextcontext){ super(context); } publicDefinedScroller(Contextcontext,Interpolatorinterpolator){ super(context,interpolator); } privateViewinitViewPager(Contextcontext){ Viewview=LayoutInflater.from(context).inflate(R.layout.view_pager_layout,null); this.viewPager=(ViewPager)view.findViewById(R.id.viewpager); this.viewPager.setOffscreenPageLimit(2); this.viewPager.setAdapter(newMyFragmentPagerAdapter(((FragmentActivity)context).getSupportFragmentManager())); returnview; } publicViewPagergetViewPager(){ returnviewPager; } publicViewinitView(Contextcontext){ Viewview=initViewPager(context); this.viewPager.setOnTouchListener(newOnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ if(event.getAction()==MotionEvent.ACTION_UP){ shouldAutoScroll=true; handler.sendEmptyMessageDelayed(0,2000); }else{ handler.removeMessages(0); shouldAutoScroll=false; } returnfalse; } }); try{ FieldmScroller=ViewPager.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); mScroller.set(viewPager,this); }catch(NoSuchFieldExceptione){ }catch(IllegalArgumentExceptione){ }catch(IllegalAccessExceptione){ } handler.sendEmptyMessageDelayed(0,2000); returnview; } publicvoidsetShouldAutoScroll(){ handler.removeMessages(0); if(viewPager.isShown()){ shouldAutoScroll=true; handler.sendEmptyMessageDelayed(0,2000); }else{ shouldAutoScroll=false; } } @Override publicvoidstartScroll(intstartX,intstartY,intdx,intdy,intduration){ super.startScroll(startX,startY,dx,dy,shouldAutoScroll?DURATION_TIME:duration); } }
关键是startScroll方法啦
3、其他测试类,
(1)TestFragment:
packagecom.example.testa; importandroid.os.Bundle; importandroid.support.v4.app.Fragment; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.ImageView; publicclassTestFragmentextendsFragment{ publicintimageResource=0; publicstaticTestFragmentnewInstance(intimageResource){ TestFragmentnewFragment=newTestFragment(); newFragment.imageResource=imageResource; returnnewFragment; } @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){ Viewview=inflater.inflate(R.layout.pager_layout,null); ImageViewtextView=(ImageView)view.findViewById(R.id.image); textView.setImageResource(imageResource); returnview; } }
(2)ViewPager的Adapter类:
packagecom.example.testa; importandroid.support.v4.app.Fragment; importandroid.support.v4.app.FragmentManager; importandroid.support.v4.app.FragmentStatePagerAdapter; publicclassMyFragmentPagerAdapterextendsFragmentStatePagerAdapter{ publicMyFragmentPagerAdapter(FragmentManagerfm){ super(fm); } @Override publicintgetCount(){ returnInteger.MAX_VALUE; } @Override publicFragmentgetItem(intarg0){ switch(arg0%4){ case0: returnTestFragment.newInstance(R.drawable.a1); case1: returnTestFragment.newInstance(R.drawable.default_wh); case2: returnTestFragment.newInstance(R.drawable.default_ww); case3: returnTestFragment.newInstance(R.drawable.test); default: returnTestFragment.newInstance(R.drawable.a1); } } }
(3)测试的Activity:
packagecom.example.testa; importjava.util.ArrayList; importjava.util.List; importandroid.os.Bundle; importandroid.support.v4.app.FragmentActivity; importandroid.view.LayoutInflater; importandroid.view.View; importandroid.view.ViewGroup; importandroid.widget.AbsListView; importandroid.widget.AbsListView.OnScrollListener; importandroid.widget.AdapterView; importandroid.widget.AdapterView.OnItemClickListener; importandroid.widget.BaseAdapter; importandroid.widget.TextView; publicclassMainActivityextendsFragmentActivity{ privateDefinedListViewlistView=null; privateList<String>list=null; privateDefinedScrollerdefinedScroller=null; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView=(DefinedListView)findViewById(R.id.listview); initListData(); initViewPager(); listView.setAdapter(newListAdapter()); listView.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>parent,Viewview,intposition,longid){ definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem()+1); } }); listView.setOnScrollListener(newOnScrollListener(){ @Override publicvoidonScrollStateChanged(AbsListViewview,intscrollState){ if(scrollState==SCROLL_STATE_IDLE){ definedScroller.setShouldAutoScroll(); } } @Override publicvoidonScroll(AbsListViewview,intfirstVisibleItem,intvisibleItemCount,inttotalItemCount){ } }); } privatevoidinitListData(){ list=newArrayList<String>(); for(inti=1;i<=20;++i){ list.add("test"+i); } } privatevoidinitViewPager(){ definedScroller=newDefinedScroller(this); listView.addHeaderView(definedScroller.initView(this)); } privateclassListAdapterextendsBaseAdapter{ @Override publicintgetCount(){ returnlist.size(); } @Override publicObjectgetItem(intposition){ returnlist.get(position); } @Override publiclonggetItemId(intposition){ returnposition; } @Override publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ TextViewtextView=(TextView)LayoutInflater.from(MainActivity.this).inflate(R.layout.text_view_layout, null); textView.setPadding(20,20,20,20); textView.setText(list.get(position)); returntextView; } } }
4、布局文件就算了吧
上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。
希望本文所述对大家Android程序设计有所帮助。