图片轮播类似控件比较多,但是真正好用的比较少,大家公认的项目banner是比较好用的, 但是作者已经很久没维护了,所以我在他的基础上优化了一部分,满足大家项目中常用的一些需求.
具体优化点:
1.优化了自定义布局,不仅仅是一张图片;
2.优化了 onPageSelected 方法调用两次的 bug;
3.增加了多种 banner 样式
目前存在一个优化点,就是实现原理上,为了兼容卡片模式,无限轮播的实现方式采用的是 adapter 的 count 取一个比较大的数值,这种方式 其实我是不太想用的,另外一个实现方式是 count 总数加 2,这其实才是真正意义的无限轮播,在这里我也是搜集了各种 banner 的实现源码, 发现第二个方式总有瑕疵.具体就是:卡片模式滑动的时候,最后一张到第一张或者第一张到最后一张图片有个延迟的白边,造成的原因是调用 的方法执行的比较慢,所以有个延迟(第二种方式可以参照 BannerNew.java 里面的代码)
所以在此希望大家有好的处理方式能提 pr,或者 issue,我会认真看,认真解决
模式 | 图片 |
---|---|
指示器模式 | |
数字模式 | |
数字加标题模式 | |
标题模式 | |
指示器加标题模式 | |
卡片模式 | |
自定义指示器模式 | |
自定义混合模式 | |
底部弧形模式 | |
指示器在外部 | |
右端缩进模式 |
dependencies{
implementation 'com.ms:banner:1.0.0'
implementation 'com.github.wenchaosong:Banner:2.4.0'
}
或者引用本地lib
compile project(':rollbanner')
<com.ms.banner.Banner
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/banner"
android:layout_width="match_parent"
android:layout_height="高度自己设置" />
.setPages(arrList, new CustomViewHolder())
class CustomViewHolder implements BannerViewHolder<String> {
private CardView mCardView;
private TextView mTextView;
@Override
public View createView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.banner_item, null);
mCardView = (CardView) view.findViewById(R.id.group);
mTextView = (TextView) view.findViewById(R.id.position);
return view;
}
@Override
public void onBind(Context context, int position, String data) {
// 数据绑定
mCardView.setCardBackgroundColor(Color.parseColor(data));
mTextView.setText(position + "");
}
}
- 注意!start()方法必须放到最后执行
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Banner banner = (Banner) findViewById(R.id.banner);
banner.setAutoPlay(true)
.setPages(arrList, new CustomViewHolder())
.start();
}
@Override
protected void onStart() {
super.onStart();
//开始轮播
if (banner != null && banner.