我们经常看到使用了viewpager的app,在每页上面都会有一个滑块来标志当前处于哪一页。在pagerview包里有android.support.v4.view.pagertitlestrip和android.support.v4.view.pagertabstrip两个组件,可以在布局文件中,作为viewpager的子标签,并设定相对与viewpager的位置(比如顶部)。但这两个组件都很丑,并且标题会随着页面一起滑动,所以一般都不用。
其实实现一个滑块标志当前页面也很简单,大概需要两步:
第一步 在布局文件viewpager的上方放置一个imageview组件,组件可以是图片或是shape资源。注意需要把imageview的scaletype属性设为matrix,就是说该组件的位置和大小由一个变换矩阵来控制;
第二步 在activity中为viewpager组件添加onpagechangelistener监听器。在onpagechangelistener里设定matrix,用于控制指示滑块imageview的位置。该监听器需要实现三个方法:
onpagescrollstatechanged:用于监听滑动状态的改变
onpagescrolled:用于监听滑动的动作
onpageseleted:用于监听页面的切换,即某个页面被选中了作为当前页面。
一般实现onpageselected方法就可以,其他两个方法可以空着。另外为了使页面切换时滑块也是平滑地滑动,可以给滑块的imageview指定一个translateanimation动画,指定动画用setanimation,tranlateanimation也很简单,有个构造函数是translateanimation(int beginx,int endx,int beginy,int endy),将运动矢量的起始位置和终止位置传给它就好了。
下面我们来看五个具体的例子:
一 实现viewpager(数据源为list<view>)
1.先在main.xml文件中添加一个viewpager:
1
2
3
4
5
6
7
8
9
10
11
|
<linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" > <android.support.v4.view.viewpager android:id= "@+id/pager" android:layout_width= "wrap_content" android:layout_height= "wrap_content" > </android.support.v4.view.viewpager> </linearlayout> |
2.创建三个view:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <textview android:id= "@+id/txt1" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "center" android:textsize= "25dp" android:text= "第一页" > </textview> </linearlayout> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <textview android:id= "@+id/txt2" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "第二页" > </textview> </linearlayout> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <textview android:id= "@+id/txt3" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "第三页" > </textview> </linearlayout> |
3.创建一个viewpager适配器类:
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
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.support.v4.view.pageradapter; import android.view.view; import android.view.viewgroup; public class viewpageradapter extends pageradapter { private list<view> lviews= new arraylist<view>(); public viewpageradapter(list<view> lviews){ this .lviews=lviews; } @override public int getcount() { return lviews.size(); } @override public boolean isviewfromobject(view arg0, object arg1) { return arg0==arg1; } @override public object instantiateitem(viewgroup container, int position) { container.addview(lviews.get(position)); return lviews.get(position); } @override public void destroyitem(viewgroup container, int position, object object) { container.removeview(lviews.get(position)); } } |
4.mainactivity.java:
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
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.support.v7.app.actionbaractivity; import android.support.v7.app.actionbar; import android.support.v4.app.fragment; import android.support.v4.view.pageradapter; import android.support.v4.view.viewpager; import android.os.bundle; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.view.window; import android.os.build; public class mainactivity extends actionbaractivity { private viewpager viewpager; private list<view> listviews= null ; viewpageradapter pageradapter; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); viewpager=(viewpager) findviewbyid(r.id.pager); listviews= new arraylist<view>(); /** * 为adapter创建数据源 */ view view1=view.inflate( this , r.layout.view1, null ); view view2=view.inflate( this , r.layout.view2, null ); view view3=view.inflate( this , r.layout.view3, null ); listviews.add(view1); listviews.add(view2); listviews.add(view3); pageradapter= new viewpageradapter(listviews) ; viewpager.setadapter(pageradapter); } } |
5.运行实例:
可以实现翻页效果。
二 添加标题
1.我们需要更改main.xml文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" > <android.support.v4.view.viewpager android:id= "@+id/pager" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "center" > <android.support.v4.view.pagertabstrip android:id= "@+id/strip" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "top" > </android.support.v4.view.pagertabstrip> </android.support.v4.view.viewpager> </linearlayout> |
2.需要更改适配器文件:
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
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.support.v4.view.pageradapter; import android.view.view; import android.view.viewgroup; public class viewpageradapter extends pageradapter { private list<view> lviews= new arraylist<view>(); private list<string> titlelist= new arraylist<string>(); public viewpageradapter(list<view> lviews,list<string> titlelist){ this .lviews=lviews; this .titlelist=titlelist; } @override public int getcount() { return lviews.size(); } @override public boolean isviewfromobject(view arg0, object arg1) { return arg0==arg1; } @override public object instantiateitem(viewgroup container, int position) { container.addview(lviews.get(position)); return lviews.get(position); } @override public void destroyitem(viewgroup container, int position, object object) { container.removeview(lviews.get(position)); } /** * 标题 */ @override public charsequence getpagetitle( int position) { // todo auto-generated method stub return titlelist.get(position); } } |
3.需要更改mainactivity.java文件:
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
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.support.v7.app.actionbaractivity; import android.support.v7.app.actionbar; import android.support.v4.app.fragment; import android.support.v4.view.pageradapter; import android.support.v4.view.pagertabstrip; import android.support.v4.view.viewpager; import android.os.bundle; import android.view.layoutinflater; import android.view.menu; import android.view.menuitem; import android.view.view; import android.view.viewgroup; import android.view.window; import android.os.build; public class mainactivity extends actionbaractivity { private viewpager viewpager; private list<view> listviews= null ; viewpageradapter pageradapter; pagertabstrip pagertabstrip; private list<string> titlelist; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); viewpager=(viewpager) findviewbyid(r.id.pager); pagertabstrip=(pagertabstrip) findviewbyid(r.id.strip); listviews= new arraylist<view>(); titlelist= new arraylist<string>(); titlelist.add( "第一页" ); titlelist.add( "第二页" ); titlelist.add( "第三页" ); /** * 为adapter创建数据源 */ view view1=view.inflate( this , r.layout.view1, null ); view view2=view.inflate( this , r.layout.view2, null ); view view3=view.inflate( this , r.layout.view3, null ); listviews.add(view1); listviews.add(view2); listviews.add(view3); pageradapter= new viewpageradapter(listviews,titlelist) ; viewpager.setadapter(pageradapter); } } |
4.运行实例如下:
三 实现viewpager(数据源为list<fragment>)
1.首先我们要创建三个fragment:
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
|
package com.yayun.viewpagerdemo; import android.os.bundle; import android.support.v4.app.fragment; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class fragment1 extends fragment { @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { return inflater.inflate(r.layout.view1, container, false ); } } package com.yayun.viewpagerdemo; import android.os.bundle; import android.support.v4.app.fragment; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class fragment2 extends fragment { @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { return inflater.inflate(r.layout.view2, container, false ); } } package com.yayun.viewpagerdemo; import android.os.bundle; import android.support.v4.app.fragment; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; public class fragment3 extends fragment { @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { return inflater.inflate(r.layout.view3, container, false ); } } |
2.设置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
29
30
31
32
33
34
35
36
37
38
39
|
package com.yayun.viewpagerdemo; import java.util.list; import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmentpageradapter; public class myfragmentpageradapter extends fragmentpageradapter { list<fragment> fragmentslist; list<string> titlelist; public myfragmentpageradapter(fragmentmanager fm,list<fragment> fragmentslist,list<string> titlelist) { super (fm); this .fragmentslist=fragmentslist; this .titlelist=titlelist; } @override public fragment getitem( int arg0) { // todo auto-generated method stub return fragmentslist.get(arg0); } @override public int getcount() { // todo auto-generated method stub return fragmentslist.size(); } @override /** * 添加标题 */ public charsequence getpagetitle( int position) { // todo auto-generated method stub return titlelist.get(position); } } |
3.mainactivity.java:
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
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.graphics.color; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.view.pagertabstrip; import android.support.v4.view.viewpager; import android.support.v4.view.viewpager.pagetransformer; import android.support.v7.app.actionbaractivity; import android.view.view; import android.view.window; public class mainactivity extends actionbaractivity { private viewpager viewpager; private list<view> listviews= null ; viewpageradapter pageradapter; pagertabstrip pagertabstrip; private list<string> titlelist; private list<fragment> fragmentslist; myfragmentpageradapter myfragmentpageradapter; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); viewpager=(viewpager) findviewbyid(r.id.pager); pagertabstrip=(pagertabstrip) findviewbyid(r.id.strip); /** * 设置pagertabstrip属性 */ pagertabstrip.setbackgroundcolor(color.green); pagertabstrip.setdrawfullunderline( false ); pagertabstrip.settextcolor(color.white); listviews= new arraylist<view>(); titlelist= new arraylist<string>(); fragmentslist= new arraylist<fragment>(); fragmentslist.add( new fragment1()); fragmentslist.add( new fragment2()); fragmentslist.add( new fragment3()); titlelist.add( "第一页" ); titlelist.add( "第二页" ); titlelist.add( "第三页" ); /** * 为adapter创建数据源 */ view view1=view.inflate( this , r.layout.view1, null ); view view2=view.inflate( this , r.layout.view2, null ); view view3=view.inflate( this , r.layout.view3, null ); listviews.add(view1); listviews.add(view2); listviews.add(view3); pageradapter= new viewpageradapter(listviews,titlelist) ; myfragmentpageradapter= new myfragmentpageradapter(getsupportfragmentmanager(), fragmentslist, titlelist); //viewpager.setadapter(pageradapter); viewpager.setadapter(myfragmentpageradapter); } } |
4.运行实例:
这种方法不会销毁不在当前页面的页面,不能实现页卡的创建和销毁。
四 实现viewpager(数据源为list<fragment>实现fargmentstatepageradapter)常用
改变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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package com.yayun.viewpagerdemo; import java.util.list; import android.support.v4.app.fragment; import android.support.v4.app.fragmentmanager; import android.support.v4.app.fragmentpageradapter; import android.support.v4.app.fragmentstatepageradapter; import android.view.view; public class myfragmentpageradapter2 extends fragmentstatepageradapter { list<fragment> fragmentslist; list<string> titlelist; public myfragmentpageradapter2(fragmentmanager fm,list<fragment> fragmentslist,list<string> titlelist) { super (fm); this .fragmentslist=fragmentslist; this .titlelist=titlelist; } @override public fragment getitem( int arg0) { // todo auto-generated method stub return fragmentslist.get(arg0); } @override public int getcount() { // todo auto-generated method stub return fragmentslist.size(); } @override /** * 添加标题 */ public charsequence getpagetitle( int position) { // todo auto-generated method stub return titlelist.get(position); } @override public object instantiateitem(view container, int position) { // todo auto-generated method stub return super .instantiateitem(container, position); } @override public void destroyitem(view container, int position, object object) { // todo auto-generated method stub super .destroyitem(container, position, object); } } |
将mainactivity.java中的adapter换一下即可,它可以实现页卡的创建和销毁。
五 onpagerchangelistener 监听使用
只需要修改mainactivity.java:
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
83
84
85
86
|
package com.yayun.viewpagerdemo; import java.util.arraylist; import java.util.list; import android.graphics.color; import android.os.bundle; import android.support.v4.app.fragment; import android.support.v4.view.pagertabstrip; import android.support.v4.view.viewpager; import android.support.v4.view.viewpager.onpagechangelistener; import android.support.v4.view.viewpager.pagetransformer; import android.support.v7.app.actionbaractivity; import android.view.view; import android.view.window; import android.widget.toast; public class mainactivity extends actionbaractivity implements onpagechangelistener { private viewpager viewpager; private list<view> listviews= null ; viewpageradapter pageradapter; pagertabstrip pagertabstrip; private list<string> titlelist; private list<fragment> fragmentslist; myfragmentpageradapter myfragmentpageradapter; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.activity_main); viewpager=(viewpager) findviewbyid(r.id.pager); pagertabstrip=(pagertabstrip) findviewbyid(r.id.strip); /** * 设置pagertabstrip属性 */ pagertabstrip.setbackgroundcolor(color.green); pagertabstrip.setdrawfullunderline( false ); pagertabstrip.settextcolor(color.white); listviews= new arraylist<view>(); titlelist= new arraylist<string>(); fragmentslist= new arraylist<fragment>(); fragmentslist.add( new fragment1()); fragmentslist.add( new fragment2()); fragmentslist.add( new fragment3()); titlelist.add( "第一页" ); titlelist.add( "第二页" ); titlelist.add( "第三页" ); /** * 为adapter创建数据源 */ view view1=view.inflate( this , r.layout.view1, null ); view view2=view.inflate( this , r.layout.view2, null ); view view3=view.inflate( this , r.layout.view3, null ); listviews.add(view1); listviews.add(view2); listviews.add(view3); pageradapter= new viewpageradapter(listviews,titlelist) ; myfragmentpageradapter= new myfragmentpageradapter(getsupportfragmentmanager(), fragmentslist, titlelist); //viewpager.setadapter(pageradapter); viewpager.setadapter(myfragmentpageradapter); viewpager.setonpagechangelistener( this ); //加载监听器 } @override public void onpagescrollstatechanged( int arg0) { // todo auto-generated method stub } @override public void onpagescrolled( int arg0, float arg1, int arg2) { // todo auto-generated method stub } @override public void onpageselected( int arg0) { toast.maketext( this , "当前页面为" +(arg0+ 1 ), toast.length_short).show(); } } |
运行实例即可以显示当前页面标签。