按照惯例先上效果图:
还有各种效果
体验Demo
点击下载或扫码下载DemoApk
写在前面
GitHub上有更加详细的使用介绍的,如果你想直接看GitHub上的也可以直接点击后面的传送门去往GitHub。我是传送门
本文的内容可能有点长,如果你想要直接但Demo的源码的,可以直接跳到最后,最后有完整的代码(包括Java代码和XML代码)。
前言
今天给大家推荐一款支持无限轮播的,简单易用、扩展性强且超级稳定的轮播图库。
为什么说简单易用? 答:因为实现起来比较简单,两行代码就可以轻松实现。
//找到控件。
BannerView bannerView = findViewById(R.id.vp_banner_view);
//设置数据源并启动轮播。
bannerView.setEntries(entries, true);
为什么说扩展性强? 答:布局样式完全由自己决定,想怎么布局就怎么布局,我的原则是你的布局你做主。如果你需要指示器你可以使用我提供的圆点型指示器也可以使用数字型指示器。什么?都不喜欢?没关系,你还可以实现Pageable接口或继承BannerIndicator抽象类实现自己什么脑洞打开的指示器都没关系。什么?不会写自定义控件?没关系可以使用任何第三方的或者任何类型的炫酷的NB的自定义控件作为指示器,只是这时你需要对BannerView设置监听,通过回调方法void onPageSelected(BannerEntry entry, int index)来为你的自定义指示器设置指针。你想要自定义翻页动画?没关系因为这个库是基于ViewPager实现的,所以你可以向使用ViewPager那样对BannerView(ViewPager的子类)调用void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer)方法设置翻页动画。不了解PageTransformer的可以百度、google或则直接拷贝google官方文档中的样板,网上以大堆。注意,虽然BannerView是ViewPager的子类,但是依然支持改变翻页动画时长,依然支持自定义动画差值器(可通过代码和XML两种方式实现)。
为什么说超级稳定? 答:大家都知道我们的轮播图一般都是配合RecyclerView或ListView作为它的一个Iitem使用的。但是VeiwPager在配合RecyclerView使用时有很多问题(ListView没有验证过不过根据Bug的原因推测也是有问题的)。比如,当ViewPager自动滑动到一半的时候,将其隐藏再显示后,会出现无法自动滑完,动画会在隐藏时的位置卡住,直到下一次自动轮播才会恢复(只不过很多app的翻页动画时间过短,所以很难出现这种问题)。再比如,当ViewPager完全隐藏后再次显示则在下一次轮播时没有动画。还有其他的问题就不一一赘述了(以上问题在市场上的很多app都存在。)。这些问题这个库都解决了。(不知不觉写了这么多,是不是有点王婆卖瓜?)
下面进入正题
Gradle配置
首先要在你的Gradle中进行配置才可以使用。
第一步:添加 JitPack 仓库到你项目根目录的 gradle 文件中。
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
第二步:添加这个依赖。
dependencies {
implementation 'com.github.kelinZhou:Banner:2.5.6'
}
XML中使用
android:id="@+id/vp_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:bannerIndicator="@+id/biv_indicator"
app:titleView="@+id/tv_title"
app:pagingIntervalTime="3000"
app:singlePageMode="canNotPaging|noIndicator"
app:decelerateMultiple="4"
android:background="#FFF"/>
可以看到,基本所有的配置在布局中都可以完成(当然,也提供了通过代码配置的方法)。
指示器的使用
如果你需要指示器,本依赖库默认提供了两种指示器。你不需要在代码中做任何事情,所有的配置都可以在XML中完成。
圆点型指示器在XML中的使用
android:id="@+id/biv_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:totalCount="4"
app:pointRadius="3dp"
app:selectedPointRadius="4dp"
app:pointSpacing="4dp"
app:pointColor="#5fff"
app:selectedPointColor="@android:color/white"/>
数字型指示器在XML中的使用
android:id="@+id/biv_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@android:color/white"
app:separator="/"
app:separatorTextColor="@android:color/holo_green_light"
app:currentPageTextColor="@android:color/white"
app:totalPageTextColor="@android:color/white"
app:totalCount="6"/>
BannerView的自定义属性
app:pagingIntervalTime 翻页间隔时长,用来配置每次自动翻页之间所间隔的时间,单位为毫秒。例如你想每5秒自动翻页一次,那么该属性应该为5000。
app:decelerateMultiple 翻页动画减速倍数,因为BannerView是继承自ViewPager,所以每次自动翻页所需要的时长都是较短的,你可以通过设置该属性来配置减速倍数,也就是你希望每次自动翻页所需要的时长是ViewPager原时长的多少倍。
app:bannerIndicator 为BannerView指定指示器,只要是实现了Pageable接口的View都可以,该库中所提供的所以指示器都实现了Pageable接口,如果你不满足于我提供的指示器控件,那么你可以自己动手写只要实现Pageable接口就可以配合BannerView使用。例如样例中的该属性的值为:@+id/biv_indicator
app:titleView 为BannerView指定用来显示标题的控件,通过该属性配置标题控件后你就不需要监听BannerView的切换,然后再为标题控件赋值。只要你配置了该属性我会自动为你赋值。前提是你要配置的控件必须是TextView或其子类。例如样例中的该属性的值为:@+id/tv_title
app:subTitleView 为BannerView指定用来显示副标题的控件,通过该属性配置标题控件后你就不需要监听BannerView的切换,然后再为副标题控件赋值。只要你配置