Android实现图片自动轮播并且支持手势左右无限滑动
程序员文章站
2024-03-04 13:57:41
废话不多说了,先给大家上左右无限滑动的代码了。
1.左右无限滑动
public class mainactivity extends appcompatacti...
废话不多说了,先给大家上左右无限滑动的代码了。
1.左右无限滑动
public class mainactivity extends appcompatactivity { private static viewpager viewpager; private radiogroup group; //图片资源,实际项目需要从网络获取 private int[] imageids = {r.drawable.ym1, r.drawable.ym2, r.drawable.ym3, r.drawable.ym4}; //存放图片的数组 private list<imageview> mlist; //当前索引位置以及上一个索引位置 private static int index = 0, preindex = 0; //是否需要轮播标志 private boolean iscontinue = true; //定时器,用于实现轮播 private timer timer = new timer(); private myhandler mhandler; public static class myhandler extends handler { private weakreference<mainactivity> weakreference; public myhandler(mainactivity activity) { weakreference = new weakreference<>(activity); } @override public void handlemessage(message msg) { if (weakreference.get() != null) { index++; viewpager.setcurrentitem(index); } super.handlemessage(msg); } } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); initdata(); addlistener(); //让当前图片位于中间某个位置,目的就是为了开始能够左滑 viewpager.setcurrentitem(imageids.length * 100); initradiobutton(imageids.length);//注意这句和上面那句顺序不能写反,否则会出现第一个圆点无法显示选中状态 startswitch(); } /** * 初始化控件 */ public void initview() { viewpager = (viewpager) findviewbyid(r.id.viewpager); group = (radiogroup) findviewbyid(r.id.group); } /** * 初始化数据 */ public void initdata() { mlist = new arraylist<>(); viewpager.setadapter(pageradapter); mhandler = new myhandler(this); } /** * 添加监听 */ public void addlistener() { viewpager.addonpagechangelistener(onpagechangelistener); viewpager.setontouchlistener(ontouchlistener); } /** * 进行图片轮播 */ public void startswitch() { //执行定时任务 timer.schedule(new timertask() { @override public void run() { //首先判断是否需要轮播,是的话我们才发消息 if (iscontinue) { mhandler.sendemptymessage(1); } } }, 3000, 3500);//延迟3秒,每隔3.5秒发一次消息; } /** * 根据图片个数初始化按钮 * @param length 图片所在集合长度 */ private void initradiobutton(int length) { for (int i = 0; i < length; i++) { imageview imageview = new imageview(this); imageview.setimageresource(r.drawable.rg_selector);//设置背景选择器 imageview.setpadding(20, 0, 0, 0);//设置每个按钮之间的间距 //将按钮依次添加到radiogroup中 group.addview(imageview, viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); //默认选中第一个按钮,因为默认显示第一张图片 group.getchildat(0).setenabled(false); } } /** * 根据当前触摸事件判断是否要轮播 */ view.ontouchlistener ontouchlistener = new view.ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { //手指按下和划动的时候停止图片的轮播 case motionevent.action_down: case motionevent.action_move: iscontinue = false; break; default: iscontinue = true; } return false;//注意这里只能返回false,如果返回true,dwon就会消费掉事件,move无法获得事件, // 导致图片无法滑动 } }; /** * 根据当前选中的页面设置按钮的选中 */ viewpager.onpagechangelistener onpagechangelistener = new viewpager.onpagechangelistener() { @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } @override public void onpageselected(int position) { index = position;//当前位置赋值给索引 setcurrentdot(index % imageids.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @override public void onpagescrollstatechanged(int state) { } }; /** * 设置对应位置按钮的状态 * @param i 当前位置 */ private void setcurrentdot(int i) { if (group.getchildat(i) != null) { group.getchildat(i).setenabled(false);//当前按钮选中,显示蓝色 } if (group.getchildat(preindex) != null) { group.getchildat(preindex).setenabled(true);//上一个取消选中。显示灰色 preindex = i;//当前位置变为上一个,继续下次轮播 } } pageradapter pageradapter = new pageradapter() { @override public int getcount() { //返回一个比较大的值,目的是为了实现无限轮播 return integer.max_value; } @override public boolean isviewfromobject(view view, object object) { return view == object; } @override public object instantiateitem(viewgroup container, int position) { position = position % imageids.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 imageview imageview = new imageview(mainactivity.this); imageview.setimageresource(imageids[position]); imageview.setscaletype(imageview.scaletype.fit_xy); container.addview(imageview); mlist.add(imageview); return imageview; } @override public void destroyitem(viewgroup container, int position, object object) { // 注意在此不要做任何操作,因为我们需要实现向左滑动,否则会产生indexoutofboundsexception } }; @override protected void ondestroy() { super.ondestroy(); //页面销毁的时候取消定时器 if (timer != null) { preindex = 0; timer.cancel(); } } }
2.单向滑动
public class mainactivity extends appcompatactivity { private static viewpager viewpager; private radiogroup group; //图片资源,实际项目需要从网络获取 private int[] imageids = {r.drawable.ym1, r.drawable.ym2, r.drawable.ym3, r.drawable.ym4}; //存放图片的数组 private list<imageview> mlist; //当前索引位置以及上一个索引位置 private static int index = 0, preindex = 0; //是否需要轮播标志 private boolean iscontinue = true; //定时器,用于实现轮播 private timer timer = new timer(); private myhandler mhandler; public static class myhandler extends handler { private weakreference<mainactivity> weakreference; public myhandler(mainactivity activity) { weakreference = new weakreference<>(activity); } @override public void handlemessage(message msg) { if (weakreference.get() != null) { index++; viewpager.setcurrentitem(index); } super.handlemessage(msg); } } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); initdata(); addlistener(); initradiobutton(imageids.length); startswitch(); } /** * 初始化控件 */ public void initview() { viewpager = (viewpager) findviewbyid(r.id.viewpager); group = (radiogroup) findviewbyid(r.id.group); } /** * 初始化数据 */ public void initdata() { mlist = new arraylist<>(); viewpager.setadapter(pageradapter); mhandler = new myhandler(this); } /** * 添加监听 */ public void addlistener() { viewpager.addonpagechangelistener(onpagechangelistener); viewpager.setontouchlistener(ontouchlistener); } /** * 进行图片轮播 */ public void startswitch() { //执行定时任务 timer.schedule(new timertask() { @override public void run() { //首先判断是否需要轮播,是的话我们才发消息 if (iscontinue) { mhandler.sendemptymessage(1); } } }, 3000, 3500);//延迟3秒,每隔3.5秒发一次消息; } /** * 根据图片个数初始化按钮 * @param length 图片所在集合长度 */ private void initradiobutton(int length) { for (int i = 0; i < length; i++) { imageview imageview = new imageview(this); imageview.setimageresource(r.drawable.rg_selector);//设置背景选择器 imageview.setpadding(20, 0, 0, 0);//设置每个按钮之间的间距 //将按钮依次添加到radiogroup中 group.addview(imageview, viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); //默认选中第一个按钮,因为默认显示第一张图片 group.getchildat(0).setenabled(false); } } /** * 根据当前触摸事件判断是否要轮播 */ view.ontouchlistener ontouchlistener = new view.ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { //手指按下和划动的时候停止图片的轮播 case motionevent.action_down: case motionevent.action_move: iscontinue = false; break; default: iscontinue = true; } return false;//注意这里只能返回false,如果返回true,dwon就会消费掉事件,move无法获得事件, // 导致图片无法滑动 } }; /** * 根据当前选中的页面设置按钮的选中 */ viewpager.onpagechangelistener onpagechangelistener = new viewpager.onpagechangelistener() { @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } @override public void onpageselected(int position) { index = position;//当前位置赋值给索引 setcurrentdot(index % imageids.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @override public void onpagescrollstatechanged(int state) { } }; /** * 设置对应位置按钮的状态 * @param i 当前位置 */ private void setcurrentdot(int i) { if (group.getchildat(i) != null) { group.getchildat(i).setenabled(false);//当前按钮选中,显示蓝色 } if (group.getchildat(preindex) != null) { group.getchildat(preindex).setenabled(true);//上一个取消选中。显示灰色 preindex = i;//当前位置变为上一个,继续下次轮播 } } pageradapter pageradapter = new pageradapter() { @override public int getcount() { //返回一个比较大的值,目的是为了实现无限轮播 return integer.max_value; } @override public boolean isviewfromobject(view view, object object) { return view == object; } @override public object instantiateitem(viewgroup container, int position) { position = position % imageids.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 imageview imageview = new imageview(mainactivity.this); imageview.setimageresource(imageids[position]); imageview.setscaletype(imageview.scaletype.fit_xy); container.addview(imageview); mlist.add(imageview); return imageview; } @override public void destroyitem(viewgroup container, int position, object object) { container.removeview(mlist.get(position)); } }; @override protected void ondestroy() { super.ondestroy(); //页面销毁的时候取消定时器 if (timer != null) { preindex = 0; index = 0; timer.cancel(); } } }
3.加入一张图片的判断(最终版)
public class mainactivity extends appcompatactivity { private static viewpager viewpager; private radiogroup group; //图片资源,实际项目需要从网络获取 // private int[] imageids = {r.drawable.ym1, r.drawable.ym2, r.drawable.ym3, r.drawable.ym4}; private int[] imageids = {r.drawable.ym1}; //存放图片的数组 private list<imageview> mlist; //当前索引位置以及上一个索引位置 private static int index = 0, preindex = 0; //是否需要轮播标志 private boolean iscontinue = true; //定时器,用于实现轮播 private timer timer = new timer(); private myhandler mhandler; public static class myhandler extends handler { private weakreference<mainactivity> weakreference; public myhandler(mainactivity activity) { weakreference = new weakreference<>(activity); } @override public void handlemessage(message msg) { if (weakreference.get() != null) { index++; viewpager.setcurrentitem(index); } super.handlemessage(msg); } } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); initdata(); addlistener(); initradiobutton(imageids.length);//注意这句和上面那句顺序不能写反,否则会出现第一个圆点无法显示选中状态 startswitch(); } /** * 初始化控件 */ public void initview() { viewpager = (viewpager) findviewbyid(r.id.viewpager); group = (radiogroup) findviewbyid(r.id.group); } /** * 初始化数据 */ public void initdata() { mlist = new arraylist<>(); viewpager.setadapter(pageradapter); mhandler = new myhandler(this); } /** * 添加监听 */ public void addlistener() { viewpager.addonpagechangelistener(onpagechangelistener); viewpager.setontouchlistener(ontouchlistener); } /** * 进行图片轮播 */ public void startswitch() { //执行定时任务 timer.schedule(new timertask() { @override public void run() { //首先判断是否需要轮播,是的话我们才发消息 if (iscontinue) { if(imageids.length!=1)//多于一张图片才轮播 mhandler.sendemptymessage(1); } } }, 3000, 3500);//延迟3秒,每隔3.5秒发一次消息; } /** * 根据图片个数初始化按钮 * @param length 图片所在集合长度 */ private void initradiobutton(int length) { for (int i = 0; i < length; i++) { imageview imageview = new imageview(this); if(length == 1){ imageview.setvisibility(view.gone); return; } imageview.setimageresource(r.drawable.rg_selector);//设置背景选择器 imageview.setpadding(20, 0, 0, 0);//设置每个按钮之间的间距 //将按钮依次添加到radiogroup中 group.addview(imageview, viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); //默认选中第一个按钮,因为默认显示第一张图片 group.getchildat(0).setenabled(false); } } /** * 根据当前触摸事件判断是否要轮播 */ view.ontouchlistener ontouchlistener = new view.ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { //手指按下和划动的时候停止图片的轮播 case motionevent.action_down: case motionevent.action_move: iscontinue = false; break; default: iscontinue = true; } if(imageids.length == 1){ return true;//1张图片不允许滑动 } return false;//注意这里只能返回false,如果返回true,dwon就会消费掉事件,move无法获得事件, // 导致图片无法滑动 } }; /** * 根据当前选中的页面设置按钮的选中 */ viewpager.onpagechangelistener onpagechangelistener = new viewpager.onpagechangelistener() { @override public void onpagescrolled(int position, float positionoffset, int positionoffsetpixels) { } @override public void onpageselected(int position) { index = position;//当前位置赋值给索引 setcurrentdot(index % imageids.length);//因为只有四个按钮,所以我们在此要对长度区域,保证范围在0到4 } @override public void onpagescrollstatechanged(int state) { } }; /** * 设置对应位置按钮的状态 * @param i 当前位置 */ private void setcurrentdot(int i) { if (group.getchildat(i) != null) { group.getchildat(i).setenabled(false);//当前按钮选中,显示蓝色 } if (group.getchildat(preindex) != null) { group.getchildat(preindex).setenabled(true);//上一个取消选中。显示灰色 preindex = i;//当前位置变为上一个,继续下次轮播 } } pageradapter pageradapter = new pageradapter() { @override public int getcount() { //返回一个比较大的值,目的是为了实现无限轮播 return integer.max_value; } @override public boolean isviewfromobject(view view, object object) { return view == object; } @override public object instantiateitem(viewgroup container, int position) { position = position % imageids.length;//因为position非常大,而我们需要的position不能大于图片集合长度 //所以在此取余 imageview imageview = new imageview(mainactivity.this); imageview.setimageresource(imageids[position]); imageview.setscaletype(imageview.scaletype.fit_xy); container.addview(imageview); mlist.add(imageview); return imageview; } @override public void destroyitem(viewgroup container, int position, object object) { // 注意在此不要做任何操作,因为我们需要实现向左滑动,否则会产生indexoutofboundsexception container.removeview(mlist.get(position)); } }; @override protected void ondestroy() { super.ondestroy(); //页面销毁的时候取消定时器 if (timer != null) { preindex = 0; index = 0; timer.cancel(); } } }
以上所述是小编给大家介绍的android实现图片自动轮播并且支持手势左右无限滑动,希望对大家有所帮助
上一篇: Java 反射机制详解及实例