一个灵活可制定的基于 Recyclerview 的轮播图控件,支持自动轮播,无限循环。
同时可关闭无限循环变成 引导页
,带有引导完成接口回调,详见demo
1.完善一些点击事件的逻辑
2.新增当 rb_canSwipe = false
时的点击事件响应
3.修复 自定义指示器
刷新数据时没有默认选中的问题
1.新增 引导页
监听 RxBannerGuideFinishedListener
,调整引导页功能实现
2.新增单张图片时可否滑动设置 rb_canSwipeWhenSingle
, 仅单张图片时有效
1.新增滑动阻尼设置 rb_flingDamping
, 阻尼越大滑动越困难,默认为RecyclerView标准最小滑动值. 修复 issues #2
2.新增自定义指示器
,用法与说明请下翻至 指示器
部分, 由 CircleIndicator 修改整合,感谢原作者, 原始需求 issues #3
fir.im rxbanner_demo.apk
github rxbanner_demo.apk
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
implementation 'com.github.leveychen:RxBanner:1.1.3'
由于本项目采用28.0.0-rc02
的版本编译,28以下版本可能会出现依赖失败的情况,处理办法如下:
在 app.gradle
最下面添加
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
//这里指定需要统一的依赖版本,这里统一为27.1.1,这里以27.1.1为例
details.useVersion '27.1.1'
}
}
}
}
强制使用你的主项目的编译版本
see Attributes
<cn.levey.bannerlib.RxBanner
android:id="@+id/rx_banner"
android:layout_width="match_parent"
android:layout_height="160dp"/>
banner = findViewById(R.id.rx_banner);
banner
.setLoader(new ImageLoader()) // see `image loader`
.setConfig(config) // see `config`
.setDatas(iamgesUrls, titles)
.start();
Fresco Glide Picasso UniversalImageLoader
可以愉快的玩耍了,下面是一些可选内容
自定义配置信息,所有参数设置均和 xml
布局里一致,优先级高于 xml
布局文件
RxBannerConfig config = banner.getConfig();
config.set(value);
...
banner.setConfig(config);
banner.start();
setConfig() 必须在 setDatas()
和 start()
之前设置。
点击图片时的回调
banner.setOnBannerClickListener(new RxBannerClickListener())
onItemClick(int position, Object data)
onItemLongClick(int position, Object data)
//点击标题时的回调
banner.setOnBannerTitleClickListener(new RxBannerTitleClickListener())
onTitleClick(int position, String title);
//图片切换时的回调
banner.setOnBannerChangeListener(new RxBannerChangeListener())
onBannerSelected(int position)
onBannerScrollStateChanged(int state)
//一旦定义引导页监听就可变成引导页
banner.setOnGuideFinishedListener(new RxBannerGuideFinishedListener()
onGuideFinished()
更好的 在 Activity 、 Fragment 和其他 view 中管理生命周期
banner.onResume()
banner.onPause()
banner.onDestroy()
RxBannerConfig
.getInstance()
.setDebug(true) // debug: default false
.setScrollStateChangedListener(new RxBannerScrollStateChangedListener()
.setLoader(new RxBannerImageViewLoader())
.setOrientation(LinearLayout.HORIZONTAL)
.setOrderType(RxBannerConfig.OrderType.ASC)
.setTimeInterval(5000);
定义一下布局就行了
为了更好的引导页体验,最好关闭无限循环和自动轮播
banner:rb_infinite="false"
banner:rb_autoPlay="false"
然后监听一下回调
banner.setOnGuideFinishedListener(new RxBannerGuideFinishedListener()
onGuideFinished()
// todo
大功告成
所有属性均以 rb_
开头
属性 | 格式 | 初始值 | 描述 |
---|---|---|---|
rb_autoPlay | boolean | true | 以 rb_timeInterval 的间隔自动播放 |
rb_infinite | boolean | true | 是否无限循环,关闭无限循环并且设置引导页回调 即可变成引导页 |
rb_canSwipe | boolean | true | 是否允许手动滑动,此设置与自动轮播无关 |
rb_canSwipeWhenSingle | boolean | true | 单张图片时是否能手动滑动,此设置与自动轮播无关 |
rb_aspectRatio | float | / | 宽高比,数值必须大于0,拿16:9为例就是1.7778,高度等于宽度则为1,同时 android:layout_height 不能为 wrap_content 或者 match_parent 。需要随便定义一个数值, 比如 1dp 。当 orientation = vertical 且在ScrollView 中时,高度不推荐大于父容器,否则可能滑动被拦截,导致且在ScrollView 中时无法滑动 |
rb_timeInterval | integer (millisecond ) |
5000 | 200毫秒以上 |
rb_orientation | horizontal / vertical | horizontal | / |
rb_itemPercent | integer | 100 | 宽度或者高度的百分比,取决于 rb_orientation 方向 |
rb_itemScale | float | 1 | 缩放比 |
rb_itemSpace | dimension | 0 | 两个item之间的间距 |
rb_centerAlpha | float | 1 | 中间 item 透明度 |
rb_sideAlpha | float | 1 | 旁边 item 透明度 |
rb_itemMoveSpeed | float | 1 | 滑动速度 |
rb_flingDamping | float | 1 | 滑动阻尼,越大越不容易滑动 |
rb_orderType | asc / desc | asc | 升序或者降序排列 |
rb_viewPaperMode | boolean | true | 跟 ViewPaper 一样,一次滑动一页 |
rb_emptyViewText | string | '暂无图片' | 当图片为空且 'rb_emptyViewResource' 没有定义时 |
rb_emptyViewResource | reference | / | 当图片为空时显示 |
属性 | 格式 | 初始值 | 描述 |
---|---|---|---|
rb_title_visible | boolean | true | / |
rb_title_gravity | gravity | START | / |
rb_title_layout_gravity | gravity | CENTER_HORIZONTAL and BOTTOM | / |
rb_title_margin | dimension | 0dp | margin |
rb_title_padding | dimension | 3dp | padding |
rb_title_width | dimension / enum | MATCH_PARENT | / |
rb_title_height | dimension / enum | WRAP_CONTENT | / |
rb_title_size | dimension | 14sp | / |
rb_title_color | color | Color.WHITE | / |
rb_title_backgroundColor | color | #55000000 | / |
rb_title_backgroundResource | reference | / | / |
rb_title_marquee | boolean | true | 跑马灯 |
rb_title_lineSpacingMultiplier | float | 1.0f | lineSpacingMultiplier |
属性 | 格式 | 初始值 | 描述 |
---|---|---|---|
rb_indicator_visible | boolean | true | / |
rb_indicator_clickable | boolean | true | 是否可以点击指示器来切换banner |
rb_indicator_orientation | horizontal / vertical | horizontal | / |
rb_indicator_layout_gravity | gravity | BOTTOM / END | / |
rb_indicator_radius | dimension | 5dp | 指示器大小 |
rb_indicator_textSize | dimension | 14sp | numeric numeric_circle 专用 |
rb_indicator_textColor | color | Color.WHITE | numeric numeric_circle 专用 |
rb_indicator_backgroundColor | color | / | numeric numeric_circle 专用 |
rb_indicator_backgroundResource | reference | / | numeric numeric_circle 专用 |
rb_indicator_scale | float | 0.7 | scale or scale_down 专用 |
rb_indicator_margin | dimension | 8dp | margin |
rb_indicator_padding | dimension | 3dp | padding |
rb_indicator_selected_color | color | #FFFFFF | / |
rb_indicator_unselected_color | color | #33FFFFFF | / |
rb_indicator_interactiveAnimation | boolean | false | / |
rb_indicator_animationDuration | integer | 350 | 毫秒 |
rb_indicator_animationType | type | none | see AnimationType |
rb_indicator_rtl_mode | on / off / auto | auto | 支持左右自动布局 RTL |
rb_indicator_selectedResource | reference | / | custom 专用,用法参考 CircleIndicator |
rb_indicator_unselectedResource | reference | / | custom 专用,用法参考 CircleIndicator |
rb_indicator_animatorResource | reference | / | custom 专用,用法参考 CircleIndicator |
rb_indicator_animatorReverseResource | reference | / | custom 专用,用法参考 CircleIndicator |
这里抄的,了解一下 PageIndicatorView / CircleIndicator
名称 | 属性 | 预览 |
---|---|---|
AnimationType.NONE |
none |
![]() |
AnimationType.COLOR |
color |
![]() |
AnimationType.SCALE |
scale |
![]() |
AnimationType.SCALE_DOWN |
scale_down |
![]() |
AnimationType.SLIDE |
slide |
![]() |
AnimationType.WORM |
worm |
![]() |
AnimationType.FILL |
fill |
![]() |
AnimationType.THIN_WORM |
thin_worm |
![]() |
AnimationType.DROP |
drop |
![]() |
AnimationType.SWAP |
swap |
![]() |
AnimationType.NUMERIC |
numeric |
1/8 |
AnimationType.NUMERIC_CIRCLE |
numeric_circle |
(1/8) |
AnimationType.CUSTOM |
custom |
参考 CircleIndicator |
显示网络图片
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
-keep class cn.levey.bannerlib.** {
*;
}
See release notes on Github Releases
ViewPagerLayoutManager PageIndicatorView CircleIndicator
Apache-2.0. See LICENSE for detail