Android实现图片自动轮播并且支持手势左右无限滑动
作者:lxn_李小牛 发布时间:2021-11-04 22:56:46
标签:android,滑动,轮播图
废话不多说了,先给大家上左右无限滑动的代码了。
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实现图片自动轮播并且支持手势左右无限滑动网站的支持!
来源:http://blog.csdn.net/small_lee/article/details/51213245


猜你喜欢
- 手机权限检查和申请简介使用flutter进行app开发,一定会用到手机的部分权限,包括通知推送、定位、相册、存储、相机、麦克风等。而权限的检
- 数据绑定API用于JSON转换和使用属性访问或使用注解POJO(普通Java对象)。以下是它的两个类型。简单数据绑定 - 转换JSON,从J
- C#与Java相比较从整体上来看,c#和java及其相似,甚至超过了c#与c、c++的相似程度,下面是两种语言的比较。两者都能编译成跨平台,
- 本文实例总结了C#配置文件Section节点处理方法。分享给大家供大家参考。具体如下:很多时候在项目开发中,我们都需要用配置文件来存储一些关
- 前言网上SSO的框架很多,此篇文章使用的是自写的SSO来实现简单的登录授权功能,目的在于扩展性,权限这方面,自写扩展性会好点。提示:以下是本
- 一、SpringCache介绍Spring Cache 是一个优秀的缓存组件。自Spring 3.1起,提供了类似于@Transaction
- 前言本文主要给大家介绍了关于C#连接FTP时路径问题的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍:今天在开发项目时,需
- 写项目时,要求仿微信朋友圈,双击顶栏置顶,于是封装了双击回调接口,方便大家拿来就用/** * Created by Administrato
- 自己的一个小项目使用redis在一个类里可以注入成功,而在另一个类以却不能注入成功不多bb直接上代码package com.common.u
- 本文实例讲述了Java Scanner类用法及nextLine()产生的换行符问题。分享给大家供大家参考,具体如下:分析理解:Scanner
- float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间double是双精度
- 前言这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnim
- Java中数组被实现为对象,它们一般都会因为记录长度而需要额外的内存。对于一个原始数据类型的数组,一般需要24字节的头信息再加上保存值所需的
- 本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下先是效果图:主菜单:游戏:设置:错误处理:代码:#include
- 本人是从事互联网金融行业的,所以会接触到一些金融类的问题,常见的一种就是数字转汉字大小写的问题。所以抽空就写了一个小小的工具类,实现了数字转
- AndroidStudio升级后, 新建类变成了下面这个样子, 并且默认还没有修饰符, 一堆大写的英文看的我一脸懵逼, 后来在stackov
- 本文实例为大家分享了android自定义环形统计图动画的具体代码,供大家参考,具体内容如下一、测试截图二、实现原理 package
- 简介相信大家有配置过多数据源,或者即将配置多数据的朋友们,会发现网上大概有以下几种方案:1. 使用 AOP 切片进行动态数据源切换2. 使用
- 函数InternetGetConnectedState返回本地系统的网络连接状态。语法:BOOL InternetGetConnectedS
- 在java开发的实际场景中,我们经常要对时间进行格式化处理,但是每次获取开发中自己需要的格式都要重新写一个方法,这样的代码看起来是非常的笨重