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

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

服务器之家 - 编程语言 - Android - Android使用ViewPager实现滚动广告

Android使用ViewPager实现滚动广告

2022-08-24 14:21牛顿吃香蕉 Android

这篇文章主要为大家详细介绍了Android使用ViewPager实现滚动广告,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在一些类似于淘宝的电商网站上经常能够看到一些滚动的广告条,许多软件在首页也有类似的广告条,如图:

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
<?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="yuxin.ad.MainActivity">
 
 <android.support.v4.view.ViewPager
  android:id="@+id/viewPager"
  android:layout_width="wrap_content"
  android:layout_height="200dp"
  android:adjustViewBounds="true" />
 
 <LinearLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_alignBottom="@id/viewPager"
  android:background="#33000000"
  android:orientation="vertical"
  android:padding="5dp">
 
  <LinearLayout
   android:id="@+id/show_point"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center_horizontal"
   android:orientation="horizontal" />
 </LinearLayout>
</RelativeLayout>

最上面是一个ViewPager,用来展示需要滚动播放的图片;下面是一个 线性布局,用来放最下面的几个小圆点,也可以在里面放一些TextView等,小圆点的 数量是根据图片数量动态添加的。

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
public class MainActivity extends AppCompatActivity {
 private ViewPager viewPager;
 // 存放图片
 private List<ImageView> imageViewList;
 private ImageView imageView;
 // 存放小圆点布局文件
 private LinearLayout layoutPointGroup;
 // 线程开关,当activity销毁后,线程也应该停止运行
 private boolean isStop = false;
 private int previousPoint = 0;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  // 初始化
  init();
  //设置图片自动滚动
  new Thread(new Runnable() {
 
   @Override
   public void run() {
    //如果activity未销毁则一直执行
    while (!isStop) {
     //先休息3秒钟
     try {
      Thread.sleep(3000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     //以下代码发送到主线程中执行
     runOnUiThread(new Runnable() {
      @Override
      public void run() {
       viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
      }
     });
    }
   }
  }).start();
 }
 
 private void init() {
  viewPager = (ViewPager) findViewById(R.id.viewPager);
  layoutPointGroup = (LinearLayout) findViewById(R.id.show_point);
  imageViewList = new ArrayList<ImageView>();
 
  // TODO:获取图片ID
  int[] imageIDs = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
  for (int id : imageIDs) {
   // 构造新的图片对象,并根据id 设置图片背景
   imageView = new ImageView(this);
   imageView.setImageResource(id);
   // 所有图片都存放在 imageViewList 里面
   imageViewList.add(imageView);
 
   // 构造小点
   View v = new View(this);
   // 设置小点的宽和高
   LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(8, 8);
   // 设置小点的左边距
   params.leftMargin = 12;
   v.setLayoutParams(params);
   // 设置小点是否可用,默认都不可用,当不可用时,小点是透明的,否则是白色的
   v.setEnabled(false);
   // 设置小点的背景,这个背景是使用xml文件画的一个小圆点
   v.setBackgroundResource(R.drawable.pointer_selector);
   // 把小点添加到它的布局文件中
   layoutPointGroup.addView(v);
  }
 
  // 计算应用打开时显示的第一项 Integer.MAX_VALUE /2 - 3=0
  int index = Integer.MAX_VALUE / 2 - 3;
  // 给mViewPager设置数据
  viewPager.setAdapter(new MyPagerAdapter());
  // 给mViewPager设置页面滑动事件
  viewPager.setOnPageChangeListener(new MyOnPageChangeListener());
 
  // 设置应用打开时显示的第一项,index的值为0
  // 使用这种方式得到的0,和直接写0有什么区别呢?
  // 直接写0,应用打开后不能直接向右滑动,因为viewpager中存image位置不能为负值,只能先向左滑动
  // 这种方式得到的0,可以实现应用一打开,就可以向右滑动
  viewPager.setCurrentItem(index);
 }
 
 private class MyPagerAdapter extends PagerAdapter {
 
  @Override
  public int getCount() {
   return Integer.MAX_VALUE;
  }
 
  @Override
  public boolean isViewFromObject(View view, Object object) {
   return view == object;
  }
 
  // 当一页滑出去的时候将它销毁
  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
   container.removeView(imageViewList.get(position % imageViewList.size()));
  }
 
  // 向容器中添加图片,由于我们要实现循环滑动的效果,所以要对position取模
  @Override
  public Object instantiateItem(ViewGroup container, int position) {
   container.addView(imageViewList.get(position % imageViewList.size()));
   return imageViewList.get(position % imageViewList.size());
  }
 }
 
 private class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {
 
  // 开始
  @Override
  public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
 
  }
 
  // 进行时
  @Override
  public void onPageSelected(int position) {
   // 当页面滑动结束时,先对页面位置取模
   position = position % imageViewList.size();
   // 将上一个点的可用性设置为false
   layoutPointGroup.getChildAt(previousPoint).setEnabled(false);
   // 把当前点的可用性设置为true
   layoutPointGroup.getChildAt(position).setEnabled(true);
   // 把当前位置值赋值给previousPoint
   previousPoint = position;
  }
 
  // 结束
  @Override
  public void onPageScrollStateChanged(int state) {
 
  }
 }
 
 // 当activity销毁时,让线程停止
 @Override
 public void onDestroy() {
  isStop = true;
  super.onDestroy();
 }
}

具体功能实现可以看代码里的注释,写的十分详细了。

未选中的小圆点pointer_disable.xml:

?
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="oval" >
 
 <!-- 设置圆角半径 -->
 <corners android:radius="0.5dip" />
 
 <!-- 设置填充的颜色 -->
 <solid android:color="#55000000" />
 
</shape>

选中时的小圆点pointer_focus.xml:

?
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="oval" >
 
 <corners android:radius="0.5dip" />
 
 <solid android:color="#aaFFFFFF" />
 
</shape>

小圆点选择器:

?
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <!-- 选中时,小点为白色 -->
 <item android:drawable="@drawable/pointer_focus" android:state_enabled="true"></item>
 <!-- 未选中时,小点为透明色 -->
 <item android:drawable="@drawable/pointer_disable" android:state_enabled="false"></item>
</selector>

完整源码下载

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

原文链接:https://blog.csdn.net/yuxin1100/article/details/51636679

延伸 · 阅读

精彩推荐