本文实例讲述了Android编程实现ListView头部ViewPager广告轮询图效果。分享给大家供大家参考,具体如下:
之前看了别人的一些软件,发现其广告图轮询的时候,那个广告感觉和ViewPager的效果不太一样,后来也查了一下,是因为时间问题,找了一些资料,自己也实践一下。
1、为了解决ListView头部加ViewPager滑动冲突问题,必须自定义ListView,重写里面的onInterceptTouchEvent方法,ListView代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.example.testa; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ListView; public class DefinedListView extends ListView { public DefinedListView(Context context) { super (context); } public DefinedListView(Context context, AttributeSet attrs) { super (context, attrs); } public DefinedListView(Context context, AttributeSet attrs, int defStyle) { super (context, attrs, defStyle); } private float xDistance, yDistance, xLast, yLast; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: xDistance = yDistance = 0f; xLast = ev.getX(); yLast = ev.getY(); break ; case MotionEvent.ACTION_MOVE: final float curX = ev.getX(); final float curY = ev.getY(); xDistance += Math.abs(curX - xLast); yDistance += Math.abs(curY - yLast); xLast = curX; yLast = curY; if (xDistance > yDistance) { return false ; } } return super .onInterceptTouchEvent(ev); } } |
2、为了让广告轮询的速度减慢,必须重新设置ViewPager的Scroller,自定义的Scroller如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
package com.example.testa; import java.lang.reflect.Field; import android.annotation.SuppressLint; import android.content.Context; import android.os.Handler; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.Interpolator; import android.widget.Scroller; public class DefinedScroller extends Scroller { private int DURATION_TIME = 1000 ; private boolean shouldAutoScroll = true ; private ViewPager viewPager = null ; @SuppressLint ( "HandlerLeak" ) private final Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { if (shouldAutoScroll) { viewPager.setCurrentItem(viewPager.getCurrentItem() + 1 ); handler.sendEmptyMessageDelayed( 0 , 2000 ); } }; }; public DefinedScroller(Context context) { super (context); } public DefinedScroller(Context context, Interpolator interpolator) { super (context, interpolator); } private View initViewPager(Context context) { View view = 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( new MyFragmentPagerAdapter(((FragmentActivity) context).getSupportFragmentManager())); return view; } public ViewPager getViewPager() { return viewPager; } public View initView(Context context) { View view = initViewPager(context); this .viewPager.setOnTouchListener( new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { shouldAutoScroll = true ; handler.sendEmptyMessageDelayed( 0 , 2000 ); } else { handler.removeMessages( 0 ); shouldAutoScroll = false ; } return false ; } }); try { Field mScroller = ViewPager. class .getDeclaredField( "mScroller" ); mScroller.setAccessible( true ); mScroller.set(viewPager, this ); } catch (NoSuchFieldException e) { } catch (IllegalArgumentException e) { } catch (IllegalAccessException e) { } handler.sendEmptyMessageDelayed( 0 , 2000 ); return view; } public void setShouldAutoScroll() { handler.removeMessages( 0 ); if (viewPager.isShown()) { shouldAutoScroll = true ; handler.sendEmptyMessageDelayed( 0 , 2000 ); } else { shouldAutoScroll = false ; } } @Override public void startScroll( int startX, int startY, int dx, int dy, int duration) { super .startScroll(startX, startY, dx, dy, shouldAutoScroll ? DURATION_TIME : duration); } } |
关键是startScroll方法啦
3、其他测试类,
(1)TestFragment:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package com.example.testa; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; public class TestFragment extends Fragment { public int imageResource = 0 ; public static TestFragment newInstance( int imageResource) { TestFragment newFragment = new TestFragment(); newFragment.imageResource = imageResource; return newFragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.pager_layout, null ); ImageView textView = (ImageView) view.findViewById(R.id.image); textView.setImageResource(imageResource); return view; } } |
(2)ViewPager的Adapter类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.example.testa; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; public class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super (fm); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public Fragment getItem( int arg0) { switch (arg0 % 4 ) { case 0 : return TestFragment.newInstance(R.drawable.a1); case 1 : return TestFragment.newInstance(R.drawable.default_wh); case 2 : return TestFragment.newInstance(R.drawable.default_ww); case 3 : return TestFragment.newInstance(R.drawable.test); default : return TestFragment.newInstance(R.drawable.a1); } } } |
(3)测试的Activity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package com.example.testa; import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.BaseAdapter; import android.widget.TextView; public class MainActivity extends FragmentActivity { private DefinedListView listView = null ; private List<String> list = null ; private DefinedScroller definedScroller = null ; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (DefinedListView) findViewById(R.id.listview); initListData(); initViewPager(); listView.setAdapter( new ListAdapter()); listView.setOnItemClickListener( new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { definedScroller.getViewPager().setCurrentItem(definedScroller.getViewPager().getCurrentItem() + 1 ); } }); listView.setOnScrollListener( new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { definedScroller.setShouldAutoScroll(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } private void initListData() { list = new ArrayList<String>(); for ( int i = 1 ; i <= 20 ; ++i) { list.add( "test" + i); } } private void initViewPager() { definedScroller = new DefinedScroller( this ); listView.addHeaderView(definedScroller.initView( this )); } private class ListAdapter extends BaseAdapter { @Override public int getCount() { return list.size(); } @Override public Object getItem( int position) { return list.get(position); } @Override public long getItemId( int position) { return position; } @Override public View getView( int position, View convertView, ViewGroup parent) { TextView textView = (TextView) LayoutInflater.from(MainActivity. this ).inflate(R.layout.text_view_layout, null ); textView.setPadding( 20 , 20 , 20 , 20 ); textView.setText(list.get(position)); return textView; } } } |
4、布局文件就算了吧
上面有些是在别的地方看到的,很久了,忘记在哪里看到的了,就写不上源地址了,敬请见谅。
希望本文所述对大家Android程序设计有所帮助。