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程序设计有所帮助。