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

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

服务器之家 - 编程语言 - Android - Android实现自动轮播图效果

Android实现自动轮播图效果

2022-08-27 16:19FanRQ_ Android

这篇文章主要为大家详细介绍了Android实现自动轮播图效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android实现轮播图效果展示的具体代码,供大家参考,具体内容如下

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
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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
public class MainActivity extends AppCompatActivity {
 
 private LinearLayout ll_dots;
 private TextView viewpager_tv;
 
 // 将ViewPager定义为全局变量,方便使用.
 private ViewPager viewpager_vp;
 
 // 建立一个ArrayList集合.泛型指定为ImageView.
 ArrayList<ImageView> imageViews = new ArrayList<ImageView>();
 
 
 
 //创建一个handler对象,复写handlerMessage方法,用switch方法,通过msg.what得到标识.333
 private Handler handler = new Handler() {
  @Override
  public void handleMessage(Message msg) {
   switch (msg.what) {
    case 1:
     //得到当前VIewPager和用户交互的item条目.VIewPager对象.getCurrentItem 333
     int currentItem = viewpager_vp.getCurrentItem();
     //设置ViewPager当前显示的界面,得到的ITem+1
     viewpager_vp.setCurrentItem(currentItem + 1);
     //通过静态方法sendEmptyMessageDelayed,延时重复执行命令.注意不是sendEmptyMessageAtTime 333
     sendEmptyMessageDelayed(1, 3000);
     break;
    default:
     break;
   }
 
  }
 };
 
 //图片int数组资源
 private int[] imageResIds = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f};
 
 //图片字符串数组String[]资源.
 private String[] descs = {
   "网页设计师联盟",
   "教程网",
   "PS联盟",
   "25学堂",
   "课工场带你逆袭,助你走向人生巅峰",
   "当你因需求被项目经理频繁修改,而想之暴打时,请先看易老师贱笑图,你是不是更想打我了"
 };
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //对控件进行初始化
  init();
 }
 
 /**
  * 对VIewPager进行初始化.
  */
 private void init() {
  //找到可以设置点的容器LinearLayout的对象,进行点的添加
  ll_dots = (LinearLayout) findViewById(R.id.ll_dots);
  //找到文本的对象.
  viewpager_tv = (TextView) findViewById(R.id.viewpager_tv);
  //找到VIewPager对象.
  viewpager_vp = (ViewPager) findViewById(R.id.viewpager_vp);
 
  //更加图片int数组资源的数量,动态的创建ImageView控件.就是有几张图片,创建几个ImageView,for循环
  for (int x = 0; x < imageResIds.length; x++) {
   //创建ImageView对象
   ImageView imageView = new ImageView(this);
   //通过该对象添加图片资源.setBackgroundResource方法.
   imageView.setBackgroundResource(imageResIds[x]);
   //把控件添加到集合ImageViews中去,以方便在VIewPager的适配器里instantiateItem方法获取.
   imageViews.add(imageView);
   //进行点的添加,其个数和图片的个数一致,因此放到该循环中.222
   dot();
  }
 
  //设置适配器.setAdapter
  viewpager_vp.setAdapter(new Myadapter());
  //设置ViewPager的滑动监听器,addOnPageChangeListener,set的方法因为名字的原因被淘汰了,在onPageScrolled中.222
  viewpager_vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
 
 
   @Override
   public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    //同过getCurrentItem方法拿到当前用户所交互ViewPager的item位置.
    int currentItem = viewpager_vp.getCurrentItem();
    //通过得到的这个item,给text和点进行选中的设置.
    changeTextAndDot(currentItem % imageResIds.length);
    Log.d("aaa", "onPageScrolled: Position-" + position + " positionOffset-" + positionOffset + " positionOffsetPixels-" + positionOffsetPixels);
 
   }
 
   @Override
   public void onPageSelected(int position) {
    Log.d("aaa", "onPageSelected: position" + position);
   }
 
   @Override
   public void onPageScrollStateChanged(int state) {
    Log.d("aaa", "onPageScrollStateChanged: state" + state);
   }
  });
  //指定VIewPager默认跳转到某页.一般是最大数的一般.setCurrentItem就是设置VIewPager跳到哪页,get是获取.333
  viewpager_vp.setCurrentItem(Integer.MAX_VALUE / 2 - 3);
 
  //通过handler,3秒后开始循环ViwePager的item.sendEmptyMessageDelayed,333
  handler.sendEmptyMessageDelayed(1, 3000);
  //设置VIewPager的触摸事件.最后抽成方法.333
  ViewPagerTouchEvent();
 }
 
 /**
  * 注意:看一个方法或类的信息快捷键:Ctrl+Q;
  * 像ListVIew一样,创建一个ViewPager的适配器,自定义一个类继承PagerAdapter
  */
 private class Myadapter extends PagerAdapter {
  //getContent,设置ViewPager的条目个数.一般就是集合或者资源数组的长度.
  @Override
  public int getCount() {
   //把返回的条目设置为无限大.333
   //注意:一般和获取ViewPager当前选中的是第几页有关的都要改为position(当前页数)%list.size()(取余数),你就看哪报错,根据报错改333
   return Integer.MAX_VALUE;
  }
 
  //isViewFromObject,判断ViewPager的条目View对象和InstantiateItem返回的Object对象是否一致,固定格式:return view==object;
  @Override
  public boolean isViewFromObject(View view, Object object) {
   return view == object;
  }
 
  //Ctrl+H:看到一个类的基础结构图 ctrl+h+l:快速格式化.
  //instantiateItem,ViewPager添加条目的操作.container:VIewPager的化身,控件都是添加到他身上,position:代表用户滑动条目的位置
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
   //根据条目所在位置(利用Position),从ImageViews集合里获取相对应的ImageVIew图片.
   ImageView imageView = imageViews.get(position % imageResIds.length);
   //把得到ImageView对象,添加给VIewPager对象,也就是container,使用addView
   container.addView(imageView);
   //注意:你添加给VIewPager什么控件,就要返回该控件,给isViewFromObject进行比较判断,这里添加的是ImageView,返回的就是ImageView
   return imageView;
  }
 
  //防止内存泄漏.相当于ListView的复用container,销毁一个page,该方法的实际就是将instantiateItem返回的VIew对象从ViewPager中移除,
  //container:还是ViewPager控件自身 position: object:则代表了View控件,使用时要强转成View一下
  //补充:为什么参数是Object,而不直接是View,因为虽然99%是view,但也有可能是Fragment,所以用Object,提高了可扩展性.
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
   //构造方法删除后,也是固定格式:container.removeView((View) object);
   container.removeView((View) object);
  }
 }
 
 
 /**
  * 更加图片资源的数量,动态的创建点222
  */
 public void dot() {
  //创建一个View对象;
  View view = new View(this);
  //为这个View对象设置背景setBackgroundResource
  view.setBackgroundResource(R.drawable.dot_normal);
  //为View对象设置宽高参数,使用参数对象LayoutParams(int,int),给哪个容器,就用哪个容器创建
  LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(8, 8);
  //使用参数对象LayoutParams.leftMargin=int,相当于布局里的padding.
  layoutParams.leftMargin = 8;
  //把准备好的layoutParams参数对象,设置给View对象.setLayoutParams
  view.setLayoutParams(layoutParams);
  //最后容器对象.addView(VIwe);
  ll_dots.addView(view);
 }
 
 
 /**
  * 根据ViewPager的item的变化,也就是图片切换的操作,设置对应的点和文本.222
  *
  * @param position int ViewPager的item,也是图片的位置
  */
 public void changeTextAndDot(int position) {
  //根据ViewPager的item的变化,设置对应的文本.setText(descs[position]);
  viewpager_tv.setText(descs[position]);
  //对点进行判断是否是当前页的点,用for循环,拿到所有点的位置,然后和position对比
  for (int x = 0; x < imageResIds.length; x++) {
   //.getChildAt(x);拿到容器的子控件.得到VIew对象
   View childAt = ll_dots.getChildAt(x);
   //为View设置背景图片,,使用三元运算符.
   childAt.setBackgroundResource(x == position ? R.drawable.dot_focus : R.drawable.dot_normal);
  }
 }
 
 /**
  * 该方法主要设置VIewPager的触摸事件,实现用户的触摸时,不再自动播放.switch中motionEvent.getActivity.333
  * 另一种实现的思路,是在ViewPager监听事件里面,对ViewPager的状态进行判断.闲置-滑动,和用户交互中-移除滑动.
  * public void onPageScrollStateChanged(int state) {
  * //当滑动状态发生改变的时候,手动滑动的时候,不能进行界面切换操作
  * //SCROLL_STATE_IDLE : 空闲状态
  * if (state == ViewPager.SCROLL_STATE_IDLE) {
  * //自动切换界面
  * handler.sendEmptyMessageDelayed(VIEWPAGER_SWITCH_PAGE, 3000);
  * }else{
  * //停止自动切换
  * //停止界面切换操作
  * handler.removeMessages(VIEWPAGER_SWITCH_PAGE);
  * }
  * }
  */
 public void ViewPagerTouchEvent() {
  viewpager_vp.setOnTouchListener(new View.OnTouchListener() {
   @Override
   public boolean onTouch(View view, MotionEvent motionEvent) {
    switch (motionEvent.getAction()) {
     case MotionEvent.ACTION_DOWN:
      //当时MotionEvent.ACTION_DOWN和ACTION_MOVE,就移除handler发送的message.removeMessages.333
      handler.removeMessages(1);
      break;
     case MotionEvent.ACTION_MOVE:
      handler.removeMessages(1);
      break;
     //当用户手松开时ACTION_UP,就继续使用sendEmptyMessageDelayed发送handler的消息.333
     case MotionEvent.ACTION_UP:
      handler.sendEmptyMessageDelayed(1, 3000);
     default:
      break;
    }
    return false;
   }
  });
 }
 
 
 @Override
 protected void onDestroy() {
  super.onDestroy();
  handler.removeMessages(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
<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.support.v4.view.ViewPager
  android:id="@+id/viewpager_vp"
  android:layout_width="wrap_content"
  android:layout_height="300dp" />
 <!-- 定义lineatLayout时,background="#88000000",gravity="center_horizontal" padding="8dp"
   android:layout_alignBottom="@+id/viewpager_vp" 小点用一个LinearLayout来包裹.-->
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="#88000000"
  android:gravity="center_horizontal"
  android:padding="8dp"
  android:layout_alignBottom="@+id/viewpager_vp"
  android:orientation="vertical">
  <!--此处状态选择器的选择属性是state_selected,而不是state_pressed,
   要知道他们的区别,引用图片drawable,注意V是大写,
   点是根据图片的张数,动态创建的,所有我们的View还要注释掉.-->text
  <TextView
   android:id="@+id/viewpager_tv"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textColor="@android:color/white"
   android:text="我是帅哥"/>
 
  <LinearLayout
   android:id="@+id/ll_dots"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:orientation="horizontal"
   android:gravity="center_horizontal">
<!--   <View
    android:layout_width="5dp"
    android:layout_height="5dp"
    android:background="@drawable/dot_focus"/>-->
  </LinearLayout>
 </LinearLayout>
</RelativeLayout>

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

原文链接:https://blog.csdn.net/FanRQ_/article/details/83142576

延伸 · 阅读

精彩推荐