需求描述
轮播图也是大部分app都有的效果,商品类跟新闻类的app是肯定会有的。
轮播图的效果跟第一次启动时的引导页类似,不过轮播图在引导页的基础上多了几个功能:在第一页也能向左滑动,在最后一页也能向右滑动
有个计时器,每隔一段时间滚动轮播图
先看效果图
代码实现
activity_main.xml
最外层是RelativeLayout,固定高度200dp,里面有ViewPager跟LinearLayout,ViewPager用来显示banner图片,LinearLayout显示点点点图片,表示当前ViewPager的选中状态。
BannerAdapter.java ViewPager适配器,继承自PagerAdapter,重写四个方法。
首先我们把要显示的图片的资源id放到一个名字为banners的int数组中,这是一个实例变量,在构造方法中传入context对象。getCount 返回int的最大值,这样有个好处就是当你滑动到来最后一页还能往后滑动。
isViewFromObject 常规写法 参数1==参数2
destroyItem 删除一条记录
instantiateItem 添加一条记录,首先传入的position的值是0到int最大值,因为我们前面的getCount方法就返回int类型最大值,所以这里我们要对图片数量进行求余,这样求余之后position的值必定小于图片数量,初始化ImageView对象,设置图片缩放类型,把position通过setTag保存到view里面,设置图片资源,给图片设置点击事件,最后把图片添加到ViewGroup里面。这个ViewGroup就是ViewPager自己,如果你看了源码,ViewPager就是继承自ViewGroup的。
onClickListener 先判断onBannerClickListener是否为空,如果不为空,调用onBannerClickListener的onClick方法。
setOnBannerClickListener 设置banner item点击监听,其实就是设置图片点击。
getBanners 返回图片资源数组。
MainActivity.java
onCreate 查找ViewPager控件,初始化BannerAdapter对象,给bannerAdapter设置点击事件(图片点击),给ViewPager设置缓存页数,设置适配器,添加页面改变监听,查找ViewGroup,循环添加显示点点点图片的ImageView,在for循环中创建ImageView对象,设置图片宽高,给图片设置资源图片,选中跟未选中资源图片不一样,默认第一个点选中。最后调用viewGroup.addView方法把图片添加进去,这个方法有第二个参数,可以设置左右外边距。通过ViewPager.setCurrentItem方法设置当前页,当前页的值给一个比较大默认值,这样做的好处就是软件刚打开Banner也能向左边滑动,最后开启计时器,这里调用postDelayed方法,这个方法可以延迟执行Runnable,它有两个参数,第一个参数是Runnable,第二个参数是延迟的时间,我们延迟5秒执行。Handler+Runnable当计时器使用大家应该都明白了把,毕竟我们前面的音乐播放器,视频播放器都这么用过。
onPageChangeListener 在onPageSelected方法中把当前的position赋值给currentItem,调用setImageBackground方法改变点点点图片的选中状态,传入了一个int类型的值,我们先对position求余之后再传入进去。
setImageBackground 改变点点点图片的选中状态,循环图片数量,根据下标从viewGroup中找出ImageView,先把背景设置成无,如果选中显示选中图片,未选中设置未选中图片。
onBannerClickListener 图片点击监听,在这里可以处理图片点击之后做的事情
onDestroy 删除计时器,大家在开发中如果有需要释放的东西一定要在onDestroy中加上,即时释放资源是一个程序员良好的习惯。所以建议大家都养成这个习惯。
源码下载:
如果您想第一时间看我的后期文章,公众号每周不定期推送:Android开发666