Skip to content

轮播图控件,支持自定义布局,支持两端缩进,类似卡片,支持无限循环和多种主题,可以灵活设置轮播样式、动画、轮播和切换时间、位置、图片加载框架等!

License

Notifications You must be signed in to change notification settings

wenchaosong/Banner

Repository files navigation

Android 图片轮播控件

图片轮播类似控件比较多,但是真正好用的比较少,大家公认的项目banner是比较好用的, 但是作者已经很久没维护了,所以我在他的基础上优化了一部分,满足大家项目中常用的一些需求.

具体优化点:
1.优化了自定义布局,不仅仅是一张图片;
2.优化了 onPageSelected 方法调用两次的 bug;
3.增加了多种 banner 样式

关于本库的优化点

目前存在一个优化点,就是实现原理上,为了兼容卡片模式,无限轮播的实现方式采用的是 adapter 的 count 取一个比较大的数值,这种方式 其实我是不太想用的,另外一个实现方式是 count 总数加 2,这其实才是真正意义的无限轮播,在这里我也是搜集了各种 banner 的实现源码, 发现第二个方式总有瑕疵.具体就是:卡片模式滑动的时候,最后一张到第一张或者第一张到最后一张图片有个延迟的白边,造成的原因是调用 的方法执行的比较慢,所以有个延迟(第二种方式可以参照 BannerNew.java 里面的代码)

所以在此希望大家有好的处理方式能提 pr,或者 issue,我会认真看,认真解决

效果图

apk 下载及动态展示

效果示例

部分效果图

模式 图片
指示器模式 效果示例
数字模式 效果示例
数字加标题模式 效果示例
标题模式 效果示例
指示器加标题模式 效果示例
卡片模式 效果示例
自定义指示器模式 效果示例
自定义混合模式 效果示例
底部弧形模式 效果示例
指示器在外部 效果示例
右端缩进模式 效果示例

使用步骤

Step 1.依赖banner

dependencies{
    implementation 'com.ms:banner:1.0.0'
    implementation 'com.github.wenchaosong:Banner:2.4.0'
}

或者引用本地lib

compile project(':rollbanner')

Step 2.在布局文件中添加Banner,可以设置自定义属性

<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="高度自己设置" />

Step 3.设置布局

.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 + "");
    }
}

Step 4.在Activity或者Fragment中配置Banner

  • 注意!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();
}

Step 5.(可选)

@Override
protected void onStart() {
    super.onStart();
    //开始轮播
    if (banner != null && banner.