轮播图是很常用的一个效果 核心功能已经实现 没有什么特殊需求 自己没事研究的 所以封装的不太好 一些地方还比较糙 为想要研究轮播图的同学提供个参考
目前测试图片为mipmap中的图片 没有写从网络加载图片 可自行根据需求在getShowView()方法中修改

1.定时切换

通过handle延时发送通知改变界面 然后在切换viewpage的界面之后 再次发送此延时通知 就ok咯 还可以通过timer定时器实现

2.无限轮播效果

如果我们只是在自动轮播到最后一页 然后进行判断让切换到第一页 这样是可以实现轮播的效果
但是 有两个问题

  1. 切换从最后一页切换到第一页的时候有一个很明显的回滚效果 不是我们想要的
  2. 当我们手动滑动的时候 在第一页和最后一页的时候 无法继续左右滑动 因为已经没有下一页了

先看张图(偷来的)

不得不说这位兄弟的图p的很形象 简直完美

虽然看到的是三张图 实际上是五张 数据多的时候也按照这种方式添加数据 当view4的时候自动切换到view5时 进行判断让到切换到view2 这样造成的感觉就是最后一张下来是第一张
我们利用viewpage自带的方法切换界面立即切换没有滚动效果 当图片一样的时候是看不出图片变化的
setCurrentItem(int item, boolean smoothScroll)
第二个参数设置false 界面切换的时候无滚动效果 默认true

好啦 接下来看代码

public class BannerViewPager extends FrameLayout { private ViewPager viewPager; private TextView tvTitle; private LinearLayout indicatorGroup; private BannerAdapter adapter; private List<String> titles;//标题集合 private List imageUrls;//图片数据 private List<View> views;//轮播图显示 private ImageView [] tips;//保存显示的小圆点 private int count;//保存imageUrls的总数 private int bannerTime=2500;//轮播图的间隔时间 private int currentItem=0;//轮播图的当前选中项 private long releaseTime = 0;//保存触发时手动滑动的时间 进行判断防止滑动之后立即轮播 private final int START=10; private final int STOP=20; private Context context; private Handler handler; private final Runnable runnable=new Runnable() { @Override public void run() { long now=System.currentTimeMillis(); if (now-releaseTime>bannerTime-500){ handler.sendEmptyMessage(START); }else{ handler.sendEmptyMessage(STOP); } } }; public BannerViewPager(Context context) { super(context); } public BannerViewPager(Context context, AttributeSet attrs) { super(context, attrs); this.context=context; titles=new ArrayList<>(); titles.add("标题1"); titles.add("标题2"); titles.add("标题3"); imageUrls=new ArrayList(); views=new ArrayList<>(); init(context,attrs); } private void init(final Context context, AttributeSet attrs){ View view= LayoutInflater.from(context).inflate(R.layout.layout_banner,this); viewPager= (ViewPager) view.findViewById(R.id.banner_view_pager); tvTitle= (TextView) view.findViewById(R.id.banner_title); indicatorGroup= (LinearLayout) view.findViewById(R.id.banner_indicator); handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case START: viewPager.setCurrentItem(currentItem+1); handler.removeCallbacks(runnable); handler.postDelayed(runnable,bannerTime); break; case STOP: releaseTime=0; handler.removeCallbacks(runnable); handler.postDelayed(runnable,bannerTime); break; } } }; } /** * 初始化数据 以及拿到数据后的各种设置 * 可以是网络地址 也可是项目图片数据 * @param imageUrls */ public void setData(List<?> imageUrls){ this.imageUrls.clear(); this.count=imageUrls.size(); this.imageUrls.add(imageUrls.get(count-1)); this.imageUrls.addAll(imageUrls); this.imageUrls.add(imageUrls.get(0)); initIndicator(); getShowView(); setUI(); } /** * 设置标题 * @param titles */ public void setTitles(List<String> titles){ this.titles.clear(); this.titles.addAll(titles); } /** * 设置小圆点指示器 */ private void initIndicator(){ tips=new ImageView[count]; LinearLayout.LayoutParams layoutParams = new LinearLayout. LayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); layoutParams.height=10; layoutParams.width=10; layoutParams.leftMargin = 5;// 设置点点点view的左边距 layoutParams.rightMargin = 5;// 设置点点点view的右边距 for (int i=0;i<count;i++){ ImageView imageView=new ImageView(context); if (i == 0) { imageView.setBackgroundResource(R.drawable.shape_circle_red); } else { imageView.setBackgroundResource(R.drawable.shape_circle_white); } tips[i] = imageView; indicatorGroup.addView(imageView, layoutParams); } } /** * 获取显示图片view */ private void getShowView(){ for (int i=0;i<imageUrls.size();i++){ ImageView imageView=new ImageView(context); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); if (imageUrls.get(i) instanceof String){ }else{ imageView.setImageResource((Integer) imageUrls.get(i)); } views.add(imageView); } } /** * 设置UI */ private void setUI(){ adapter=new BannerAdapter(); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(onPageChangeLis); viewPager.setCurrentItem(1); handler.postDelayed(runnable,bannerTime); } /** * viewPage改变监听 */ private ViewPager.OnPageChangeListener onPageChangeLis=new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //计算当前页的下标 int max = views.size() - 1; int temp = position; currentItem = position; if (position == 0) { currentItem = max - 1; } else if (position == max) { currentItem = 1; } temp = currentItem - 1; setIndicatorAndTitle(temp); } @Override public void onPageScrollStateChanged(int state) { currentItem=viewPager.getCurrentItem(); switch (state) { case 0: //Log.e("aaa","=====静止状态======"); if (currentItem == 0) { viewPager.setCurrentItem(count, false); } else if (currentItem == count + 1) { viewPager.setCurrentItem(1, false); } break; case 1: // Log.e("aaa","=======手动拖拽滑动时调用===="); releaseTime = System.currentTimeMillis(); if (currentItem == count + 1) { viewPager.setCurrentItem(1, false); } else if (currentItem == 0) { viewPager.setCurrentItem(count, false); } break; case 2: // Log.e("aaa","=======自动滑动时调用===="); break; } } }; /** * 设置指示器和标题切换 * @param position */ private void setIndicatorAndTitle(int position){ tvTitle.setText(titles.get(position)); for (int i=0;i<tips.length;i++){ if (i==position){ tips[i].setBackgroundResource(R.drawable.shape_circle_red); }else{ tips[i].setBackgroundResource(R.drawable.shape_circle_white); } } } /** * 适配器 */ class BannerAdapter 

转载于:https://www.cnblogs.com/weichao1996/p/6728627.html

Android轮播图相关推荐

  1. android github轮播图,GitHub - ZTJzzz/Banner: Android轮播图

    Android轮播图 - Banner 纵观Android古今,轮播图已然泛滥成灾!大神们各显神通大兴土木,所起楼台之高让后来者心生膜拜,纷纷Star!但不法分子也是层出不穷,为求"大神&q ...

  2. Android 轮播图从 0 到 1

    轮播图是 Android 常用功能之一,效果大概是这样的: 之前我封装写了一个,基本达到了要求,是继承了 Fragment(当时脑袋肯定锈掉了),里面 Viewpager add Fragment,这 ...

  3. android轮播图实现方案,Android轮播图实现教程

    ListView的headerView设置为轮播图之后结合上/下拉刷新/加载的模式成为现在大多数APP的一个必须具备的功能,对于许多初学者来说想要实现轮播图这样一个集线程睡眠.自动处理.替换过程中刷新 ...

  4. android开发banner框架,Android 轮播图 最火的banner框架 (包含demo和代码解释)

    在android里,轮播图的实现可以使用viewpage的控件实现,但由于实现有点繁琐,可以使用banner框架,方便快捷的实现轮播图的效果.这里首先贴上github的banner框架地址:https ...

  5. android轮播图简单实现(左右无限滑动,自动轮播)

    直接上代码了,都有注释,原理很简单 public class MainActivity extends AppCompatActivity { private static final String ...

  6. Android轮播图原理思路分析+实现方案

    来自:http://blog.csdn.net/wubihang/article/details/52512597 ListView的headerView设置为轮播图之后结合上/下拉刷新/加载的模式成 ...

  7. Android轮播换背景,Android 轮播图的实现方法总结

    SliderLayout LoopViewPage BGABanner 自定义view实现轮播 仿魅族的banner轮播图 1. SliderLayout 预览效果如下 687474703a2f2f7 ...

  8. android 轮播图

    最近做项目,自己封装了一个图片轮播的组件,主要的思想就采用ViewPager和ScrollGater实现,图片加载用的Imageloader,也可以换其他的,比如Glide.具体封装的组件件源码,这里 ...

  9. Android轮播图 banner,图片视频混播banner

    1.使用Android循环滚动控件--ViewFlipper实现方法:https://blog.csdn.net/meixi_android/article/details/84615857 2.使用 ...

最新文章

  1. python学生管理系统教学_Python项目:学生信息管理系统(完整版)
  2. 【树莓派】制作树莓派最小镜像:img裁剪瘦身
  3. 计算机软件基础操作,计算机软件基础 第九章 Excel基本操作(1页)-原创力文档...
  4. md5后得到的32位字符串存储到mysql中太占空间了_好看!快收藏:非常完整的 MySQL 规范...
  5. Elasticsearch技术解析与实战(三)文档的聚合
  6. PyTorch | torch.from_numpy使用方法 | torch.from_numpy如何使用?torch.from_numpy()例子 | 通过torch.from_numpy创建张量
  7. Metal:对开发者和用户来说意味着什么
  8. 【报告分享】2022金融科技趋势研究报告.pdf(附下载链接)
  9. 传智播客--itcastbbs(四)
  10. 自动化测试,面试【必备题】
  11. 六款值得推荐的数据挖掘得力助手
  12. python:TypeError: ‘dict_keys‘ object does not support indexing
  13. ADB 安装 + 打驱动全教程
  14. 【Unity】由Unity资源的相对路径获取资源的AssetDatabase路径
  15. python猜词游戏演讲ppt_随机猜词游戏
  16. 读《Ideal MHD》(1)-磁流体力学方程组推导
  17. Datagrip连接mysql错误[08S01]解决办法
  18. 对口升学考试计算机专业好考吗,2017届对口升学考试计算机专业月考三试题
  19. 华为emui11系统是鸿蒙系统吗,华为EMUI10.1才更新不久,EMUI11就被曝,网友:咋没见鸿蒙?...
  20. MySQL基础教程---创建、查询、备份数据库

热门文章

  1. gitlab ci php 构建,GitLab CI的入门搭建
  2. mysql 语法错误检查,解决引号的使用错误1064(42000):SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以使用正确的语法?...
  3. linux处理制表文件,linux下PDF及表格处理软件
  4. python可视化工具bokeh_浅谈python可视化包Bokeh
  5. php序列化函数输入0存不了,php序列化函数的区别
  6. php redis事务回滚,【Redis】Redis事务详解,Redis事务不支持回滚吗?
  7. 中维云视通录像文件存储及设置_视频监控存储方式选择,磁盘阵列与NVR优势对比...
  8. oracle日期相减工作日_oracle 日期相减 转载
  9. java以32位运行,强制java applet以32位而不是64位JRE运行
  10. mongodb golang 批量更新_Mongodb读取数据缓慢问题-Sparkamp;Mongodb