服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android使用viewpager计算偏移量实现选项卡功能

android使用viewpager计算偏移量实现选项卡功能

2022-09-05 15:32cf8833 Android

这篇文章主要为大家详细介绍了android使用viewpager计算偏移量实现选项卡功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了android实现选项卡功能,通过计算偏移量,设置tetxview和imageview的对应值,一些color的值读者自己去补充

实现效果图:

android使用viewpager计算偏移量实现选项卡功能

(1)简单写一个主界面的布局activity_main.xml

?
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
<?xml version="1.0" encoding="utf-8"?>
<linearlayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:cliptopadding="true"
 android:fitssystemwindows="true"
 android:background="@color/bg_color">
 
 <linearlayout
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@color/bag_gray"
 android:orientation="vertical">
 
 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="36dp"
  android:background="@android:color/white"
  android:orientation="horizontal"
  android:weightsum="3">
 
  <textview
  android:id="@+id/tab1_tv"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:layout_weight="1"
  android:gravity="center"
  android:text="商品"
  android:textcolor="@color/title_bag"
  android:textsize="18sp" />
 
  <textview
  android:id="@+id/tab2_tv"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:layout_weight="1"
  android:gravity="center"
  android:text="评价"
  android:textcolor="@color/text_color_context"
  android:textsize="18sp" />
  <textview
  android:id="@+id/tab3_tv"
  android:layout_width="0dp"
  android:layout_height="wrap_content"
  android:layout_gravity="center"
  android:layout_weight="1"
  android:gravity="center"
  android:text="详情"
  android:textcolor="@color/text_color_context"
  android:textsize="18sp" />
 
 </linearlayout>
 
 <view
  android:layout_width="match_parent"
  android:layout_height="0.5dp"
  android:background="@color/text_color_context" />
 <view
  android:id="@+id/cursor"
  android:layout_width="50dp"
  android:layout_height="2dp"
  android:layout_marginleft="40dp"
  android:layout_margintop="0dip"
  android:background="@color/title_bag"
  />
 <android.support.v4.view.viewpager
  android:id="@+id/thire_vp"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>
 </linearlayout>
 
</linearlayout>

(2)设置viewpager的适配器:fragmentadapter

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class fragmentadapter extends fragmentpageradapter {
 private arraylist<fragment> list;
 fragmentmanager fm;
 
 public fragmentadapter(fragmentmanager fm, arraylist<fragment> list){
 super(fm);
 this.fm = fm;
 this.list = list;
 }
 
 @override
 public fragment getitem(int position) {
 return list.get(position);
 }
 
 @override
 public int getcount() {
 return list.size();
 }
}

(3)然后设置三个fragment,因为有三个选项卡,所以我们新建三个fragment,分别是onefragment、twofragment 、threefragment ,布局的话也需要新建三个,跟fragment一一对应,因为布局过于简单,这里就不写了,简单写一点fragment的代码吧

?
1
2
3
4
5
6
7
8
9
public class onefragment extends fragment {
 
 @nullable
 @override
 public view oncreateview(layoutinflater inflater, @nullable viewgroup container, @nullable bundle savedinstancestate) {
 view view = inflater.inflate(r.layout.fragment_one,null);
 return view;
 }
}

(4)在mainactivity中,设置fragment的适配器,设置显示内容,并且做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
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
public class mainactivity extends fragmentactivity implements viewpager.onpagechangelistener,view.onclicklistener{
 private textview tab1tv;
 private textview tab2tv;
 private textview tab3tv;
 private view cursor;
 private viewpager thirdvp;
 
 private arraylist<fragment> fragmentlist;
 private int offset = 0;
 private int screenwidth = 0;
 private int screenl_3;
 private linearlayout.layoutparams lp;
 
 @override
 protected void oncreate(@nullable bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_product);
 
 //绑定控件
 tab1tv = (textview)findviewbyid(r.id.tab1_tv);
 tab2tv = (textview)findviewbyid(r.id.tab2_tv);
 tab3tv = (textview)findviewbyid(r.id.tab3_tv);
 cursor = (view) findviewbyid(r.id.cursor);
 thirdvp = (viewpager) findviewbyid(r.id.thire_vp);
 
 //获取屏幕宽度
 displaymetrics dm = new displaymetrics();
 getwindowmanager().getdefaultdisplay().getmetrics(dm);
 screenwidth = dm.widthpixels;
 screenl_3 = screenwidth/3; //裁剪3分之1
 lp = (linearlayout.layoutparams)cursor.getlayoutparams();
 
 fragmentlist = new arraylist<>();
 fragmentlist.add(new onefragment());
 fragmentlist.add(new twofragment());
 fragmentlist.add(new threefragment());
 
 thirdvp.setadapter(new fragmentadapter(getsupportfragmentmanager(),fragmentlist));
 thirdvp.setcurrentitem(0);
 thirdvp.setoffscreenpagelimit(2);
 
 thirdvp.setonpagechangelistener(this);
 tab1tv.setonclicklistener(this);
 tab2tv.setonclicklistener(this);
 tab3tv.setonclicklistener(this);
 }
 
 @override
 public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) {
 offset = (screenl_3-cursor.getlayoutparams().width)/2;
 log.d("tag", "111----"+position + "--" + positionoffset + "--"
  + positionoffsetpixels);
 final float scale = getresources().getdisplaymetrics().density;
 if (position == 0){
  lp.leftmargin = (int)(positionoffsetpixels/3)+offset;
 }else if(position ==1){
  lp.leftmargin = (int)(positionoffsetpixels/3)+screenl_3+offset;
 }
 cursor.setlayoutparams(lp);
 uptextcolor(position);
 }
 
 private void uptextcolor(int position){
 if (position==0){
  tab1tv.settextcolor(getresources().getcolor(r.color.title_bag));
  tab2tv.settextcolor(getresources().getcolor(r.color.text_color_context));
  tab3tv.settextcolor(getresources().getcolor(r.color.text_color_context));
 }else if(position==1){
  tab1tv.settextcolor(getresources().getcolor(r.color.text_color_context));
  tab2tv.settextcolor(getresources().getcolor(r.color.title_bag));
  tab3tv.settextcolor(getresources().getcolor(r.color.text_color_context));
 }else if(position==2){
  tab1tv.settextcolor(getresources().getcolor(r.color.text_color_context));
  tab2tv.settextcolor(getresources().getcolor(r.color.text_color_context));
  tab3tv.settextcolor(getresources().getcolor(r.color.title_bag));
 }
 }
 
 
 @override
 public void onpageselected(int position) {
 
 }
 
 @override
 public void onpagescrollstatechanged(int state) {
 
 }
 
 @override
 public void onclick(view view) {
 switch (view.getid()) {
  case r.id.tab1_tv:
  thirdvp.setcurrentitem(0);
  break;
  case r.id.tab2_tv:
  thirdvp.setcurrentitem(1);
  break;
  case r.id.tab3_tv:
  thirdvp.setcurrentitem(2);
  break;
 }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/cf8833/article/details/79898366

延伸 · 阅读

精彩推荐
  • AndroidAndroid开发学习路线图

    Android开发学习路线图

    这篇文章主要介绍了Android开发学习路线图,本文从基础、入门、进阶、高级等4个方面铺开学习路线图,需要的朋友可以参考下...

    Android教程网5872021-03-17
  • AndroidAndroid实现简单的popupwindow提示框

    Android实现简单的popupwindow提示框

    这篇文章主要为大家详细介绍了Android实现简单的popupwindow提示框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    smallredzi10222022-08-14
  • AndroidAndroid中如何获取视频文件的截图、缩略图

    Android中如何获取视频文件的截图、缩略图

    这篇文章主要介绍了Android中如何获取视频文件的截图、缩略图的相关资料,需要的朋友可以参考下...

    他叫自己MR张5942021-06-28
  • AndroidAndroid Map新用法:MapFragment应用介绍

    Android Map新用法:MapFragment应用介绍

    MapView ,MapActivity 这种的局限在于,必须要继承MapActivity,否则无法使用MapView,但是,MapFragment 这种的局限在于,必须要安装Google Play Service ,也就是说必须是...

    Android开发网7582020-12-29
  • AndroidAndroid布局之LinearLayout线性布局

    Android布局之LinearLayout线性布局

    LinearLayout是线性布局控件:要么横向排布,要么竖向排布,下面通过本篇文章给大家介绍Android布局之LinearLayout线性布局,涉及到android linearlayout 布局相关知...

    会飞的一只狼11912021-04-28
  • Android解析android中ProgressBar的用法

    解析android中ProgressBar的用法

    本篇文章是对android中ProgressBar的使用进行了详细的分析介绍,需要的朋友参考下...

    Android开发网9652021-01-29
  • AndroidOpenGL ES透视投影实现方法(四)

    OpenGL ES透视投影实现方法(四)

    这篇文章主要为大家详细介绍了OpenGL ES透视投影的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    weiers8012022-02-24
  • Androidandroid实现点击按钮切换不同的fragment布局

    android实现点击按钮切换不同的fragment布局

    这篇文章主要为大家详细介绍了android实现点击按钮切换不同的fragment布局,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    筱个椰子皮9972022-09-01