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

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

服务器之家 - 编程语言 - Android - Android ViewPager无限循环实现底部小圆点动态滑动

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

2021-06-30 15:45C_L Android

这篇文章主要为大家详细介绍了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);
  }
}

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

延伸 · 阅读

精彩推荐