gpt4 book ai didi

Android ViewPager无限循环实现底部小圆点动态滑动

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Android ViewPager无限循环实现底部小圆点动态滑动由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

页面拖动到最后一页 再向下滑动回复到 第一页,第一页向前滑动回到 最后一页 。

同时,底部红色小圆点随着页面的滑动距离比例随时改变位置 。

Android 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
<?xml version= "1.0" encoding= "utf-8" ?>
<relativelayout
   xmlns:android= "http://schemas.android.com/apk/res/android"
   xmlns:tools= "http://schemas.android.com/tools"
   android:layout_width= "match_parent"
   android:layout_height= "match_parent"
   android:paddingbottom= "@dimen/activity_vertical_margin"
   android:paddingleft= "@dimen/activity_horizontal_margin"
   android:paddingright= "@dimen/activity_horizontal_margin"
   android:paddingtop= "@dimen/activity_vertical_margin"
   tools:context= "com.lian.viewpagertest.mainactivity" >
 
   <android.support.v4.view.viewpager
     android:id= "@+id/viewpager"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent" >
   </android.support.v4.view.viewpager>
 
   <textview
     android:id= "@+id/tv"
     android:layout_width= "wrap_content"
     android:layout_height= "wrap_content"
     android:text= "内容"
     android:textsize= "25sp"
     android:layout_alignparentbottom= "true"
     android:layout_centerhorizontal= "true"
     />
 
   <relativelayout
     android:id= "@+id/rl_bottom"
     android:layout_width= "wrap_content"
     android:layout_height= "wrap_content"
     android:layout_alignparentbottom= "true"
     android:layout_centerhorizontal= "true"
     android:layout_marginbottom= "45dip" >
 
     <linearlayout
       android:id= "@+id/ll_points"
       android:layout_width= "wrap_content"
       android:layout_height= "wrap_content"
       android:orientation= "horizontal" >
     </linearlayout>
 
     <view
       android:id= "@+id/v_redpoint"
       android:layout_width= "10dip"
       android:layout_height= "10dip"
       android:background= "@drawable/red_circle" />
   </relativelayout>
</relativelayout>

其中red_circle是用shape绘制的红色小圆点 。

最后的linearlayout实际上是灰色小圆点的容器,在代码中根据数据的长度动态确定数目 。

代码:

?
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package com.lian.viewpagertest;
 
import android.os.bundle;
import android.support.v4.view.pageradapter;
import android.support.v4.view.viewpager;
import android.support.v7.app.appcompatactivity;
import android.util.log;
import android.view.view;
import android.view.viewgroup;
import android.view.viewtreeobserver;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.relativelayout;
import android.widget.textview;
 
import java.util.arraylist;
import java.util.list;
 
public class mainactivity extends appcompatactivity {
 
   private viewpager mviewpager;
   private textview mtextview;
   private linearlayout mlinearlayout;
   private view mview;
   private list<imageview> mdatalist;
   private int diatance;
 
   @override
   protected void oncreate(bundle savedinstancestate) {
     super .oncreate(savedinstancestate);
     initview();
     initdata();
     initevent();
   }
 
   /**
    * 初始化数据
    */
 
   private void initdata() {
     int [] sorce = new int []{r.drawable.a,r.drawable.b,r.drawable.c,r.drawable.d,r.drawable.e};
 
     mdatalist = new arraylist<imageview>();
 
     for ( int i = 0 ;i < sorce.length;i ++){
       imageview img = new imageview(getapplicationcontext());
       img.setimageresource(sorce[i]);
       mdatalist.add(img);
 
       //添加底部灰点
       view v = new view(getapplicationcontext());
       v.setbackgroundresource(r.drawable.gray_circle);
       //指定其大小
       linearlayout.layoutparams params = new linearlayout.layoutparams( 20 , 20 );
       if (i != 0 )
         params.leftmargin = 20 ;
       v.setlayoutparams(params);
       mlinearlayout.addview(v);
     }
 
     mviewpager.setadapter( new myadapter());
 
     //设置每次加载时第一页在max_value / 2 - extra 页,造成用户无限轮播的错觉
     int startpage = integer.max_value / 2 ;
     int extra = startpage % mdatalist.size();
     startpage = startpage - extra;
     mviewpager.setcurrentitem(startpage);
   }
 
   /**
    * viewpager的容器
    */
 
   public class myadapter extends pageradapter{
 
     @override
     public int getcount() {
       //告诉容器我们的数据长度为integer.max_value,这样就可以一直滚动
       return integer.max_value;
     }
 
     @override
     public boolean isviewfromobject(view view, object object) {
       return view == object;
     }
 
     @override
     public object instantiateitem(viewgroup container, int position) {
       //若position超过mdatalist.size(),会发生越界异常,所以这里每次超过size又从0开始计算位置
       position = position % mdatalist.size();
 
       imageview img = mdatalist.get(position);
       container.addview(img);
 
       return img;
     }
 
     @override
     public void destroyitem(viewgroup container, int position, object object) {
 
       position = position % mdatalist.size();
 
       container.removeview((view)object);
 
       // super.destroyitem(container, position, object);
     }
   }
 
   private void initevent() {
 
 
     /**
      * 当底部红色小圆点加载完成时测出两个小灰点的距离,便于计算后面小红点动态移动的距离
      */
     mview.getviewtreeobserver().addongloballayoutlistener( new viewtreeobserver.ongloballayoutlistener() {
       @override
       public void ongloballayout() {
         diatance = mlinearlayout.getchildat( 1 ).getleft() - mlinearlayout.getchildat( 0 ).getleft();
         log.d( "两点间距" ,diatance + "测出来了" );
       }
     });
 
     mviewpager.setonpagechangelistener( new viewpager.onpagechangelistener() {
       @override
       public void onpagescrolled( int position, float positionoffset, int positionoffsetpixels) {
 
         //测出页面滚动时小红点移动的距离,并通过setlayoutparams(params)不断更新其位置
         position = position % mdatalist.size();
         float leftmargin = diatance * (position + positionoffset);
         relativelayout.layoutparams params = (relativelayout.layoutparams) mview.getlayoutparams();
         params.leftmargin = math.round(leftmargin);
         mview.setlayoutparams(params);
         log.d( "红点在这" ,leftmargin + "" );
       }
 
       @override
       public void onpageselected( int position) {
 
       }
 
       @override
       public void onpagescrollstatechanged( int state) {
 
       }
     });
   }
 
   private void initview() {
 
     setcontentview(r.layout.activity_main);
 
     mviewpager = (viewpager) findviewbyid(r.id.viewpager);
 
     mtextview = (textview) findviewbyid(r.id.tv);
 
     mlinearlayout = (linearlayout) findviewbyid(r.id.ll_points);
 
     mview = findviewbyid(r.id.v_redpoint);
   }
}

以上就是本文的全部内容,希望对大家的学习有所帮助.

最后此篇关于Android ViewPager无限循环实现底部小圆点动态滑动的文章就讲到这里了,如果你想了解更多关于Android ViewPager无限循环实现底部小圆点动态滑动的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com