Android实现自动轮播图效果
程序员文章站
2022-05-27 10:07:15
本文实例为大家分享了android实现轮播图效果展示的具体代码,供大家参考,具体内容如下
mainactivity.java
public class main...
本文实例为大家分享了android实现轮播图效果展示的具体代码,供大家参考,具体内容如下
mainactivity.java
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
<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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。