欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现图片自动轮播并且支持手势左右无限滑动

程序员文章站 2024-03-05 12:37:54
废话不多说了,先给大家上左右无限滑动的代码了。 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实现图片自动轮播并且支持手势左右无限滑动,希望对大家有所帮助