Android使用ViewPager实现滚动广告
程序员文章站
2022-05-27 10:22:51
在一些类似于淘宝的电商网站上经常能够看到一些滚动的广告条,许多软件在首页也有类似的广告条,如图:
实现起来并不是很复杂的,结合网上的一些教程,实现了现在这样一个可以几...
在一些类似于淘宝的电商网站上经常能够看到一些滚动的广告条,许多软件在首页也有类似的广告条,如图:
实现起来并不是很复杂的,结合网上的一些教程,实现了现在这样一个可以几张图循环播放,并且可以手指滑动切换的效果。
工程文件结构:
布局文件:
<?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
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:
<?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:
<?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>
小圆点选择器:
<?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>
完整源码下载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。