XBanner使用保姆级教学(AndroidX环境下)

起因

最近在练习使用Kotlin,调用了玩安卓的API,其中一个功能是实现首页的banner效果,开始我准备使用了Banner来完成,但不知道什么情况,我的Banner一直导入不成功,在查找资料的过程中发现了XBanner这一开源项目,研究后发现效果很不错,下面是使用的过程。

一、XBanner介绍

XBanner支持图片无限轮播,支持AndroidX、自定义指示点、显示提示文字、切换动画、自定义布局,一屏多显、视频图片混合轮播等功能,它的GitHub地址如下:点我进入XBanner,但由于GitHub不太稳定,无法进入的小伙伴可以看一下我转载的:XBanner项目详情页转载

二、XBanner使用

导入和使用的过程其实在上面的文章都有描述,强烈建议在阅读下文时先去看一下上面的详情页,有能力的朋友也可以直接按照上面的文章中的步骤进行,我在下面的步骤会着重介绍一些容易踩得坑和一些使用技巧。

1. 导入依赖

第一步我们需要添加导入依赖的仓库位置:

//低版本Android studio适用,加入到project下的build.gradle文件中
allprojects {
     repositories {
		...
		maven { url 'https://jitpack.io' }
     }
}

第一个坑:上述的添加代码只能在低版本的Android studio中使用,在升级到Arctic Fox(2020.3.1)版本后需要将下面的代码添加到settings.gradle文件中

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        //注意,只加这一句,要看清加入的位置
        maven { url 'https://jitpack.io' }

    }
}

上述步骤完成后,就可以正常的添加依赖了,在module下的build.gradle文件中加入下面的代码

dependencies {

    //普通版本依赖
    implementation 'com.github.xiaohaibin:XBanner:1.8.9'
    //androidX 版本使用下面的依赖
    implementation 'com.github.xiaohaibin:XBanner:androidx_v1.2.6'
}

至此导包完成,可以在layout目录下的xml资源中输入如下代码检验

<com.stx.xhb.androidx.XBanner
        android:id="@+id/xb_home_banner"
        android:layout_width="match_parent"
        android:layout_height="230dp"/>

2.xml中的使用
首先我们需要看一下XBanner都有哪些属性

属性名属性说明属性值
isAutoPlay是否支持自动轮播boolean类型,默认为true
isTipsMarquee是否支持提示性文字跑马灯效果boolean类型,默认为false
AutoPlayTime图片轮播时间间隔int值,默认为5s
pointNormal指示器未选中时状态点drawable,不设置的话为默认状态点
pointSelect指示器选中时状态点drawable,不设置的话为默认状态点
pointsVisibility是否显示指示器boolean类型,默认为true
pointsPosition指示器显示位置LEFT、CENTER、RIGHT类型,默认为CENTER
pointsContainerBackground指示器背景可自定义设置指示器背景
pointContainerPosition指示器容器显示位置TOP、BOTTOM类型,默认为BOTTOM
pointContainerLeftRightPadding指示点容器左右内间距dimension,默认为10dp
pointTopBottomPadding指示点上下内间距dimension,默认为6dp
pointLeftRightPadding指示点左右内间距dimension,默认为3dp
tipTextColor提示文案的文字颜色reference
tipTextSize提示文案的文字大小dimension,默认为10dp
isShowNumberIndicator是否显示数字指示器boolean,默认为false不显示
numberIndicatorBacgroud数字指示器背景reference
isShowIndicatorOnlyOne当只有一张图片的时候是否显示指示点boolean,默认为false,不显示
isShowTips是否展示文字boolean,默认为false,不显示
pageChangeDuration图片切换速度int值,默认为1000ms
isHandLoop是否支持手动无限循环切换图片boolean类型,默认为false
placeholderDrawable设置整体轮播框架占位图reference
isClipChildrenMode是否开启一屏显示多个模式boolean类型,默认为false 默认不开启
clipChildrenLeftMargin一屏显示多个左间距dimension ,默认为30dp
clipChildrenRightMargin一屏显示多个右间距dimension ,默认为30dp
clipChildrenTopBottomMargin一屏显示多个上下间距dimension ,默认为30dp
viewpagerMarginviewpager页面间距dimension ,默认为10dp
isClipChildrenModeLessThree少于三张是否支持一屏多显模式boolean类型,默认为false 默认不开启
bannerBottomMarginbanner轮播区域底部margin,可设置指示器距离轮播图的间距dimension ,默认为0dp
scaleType设置占位图缩放类型scaleType类型
showIndicatorInCenter设一屏多显模式下 指示器是否显示在中间图片位置,默认显示中间boolean类型
isClickSide一屏多显模式下 是否支持点击侧边切换图片,默认开启boolean类型

根据上述的属性,我们很容易自定义一个好看的Banner,代码如下:

<com.stx.xhb.androidx.XBanner
        android:id="@+id/xb_home_banner"
        android:layout_width="match_parent"
        android:layout_height="230dp"
        app:AutoPlayTime="3000"
        app:isAutoPlay="false"
        app:isClipChildrenMode="true"
        app:isClipChildrenModeLessThree="true"
        app:isHandLoop="true"
        app:isShowIndicatorOnlyOne="true"
        app:isShowNumberIndicator="false"
        app:isShowTips="true"
        app:layout_constraintTop_toBottomOf="@id/ll_home_title"
        app:pageChangeDuration="800"
        app:pointsContainerBackground="#44aaaaaa"
        app:pointsPosition="RIGHT"
        app:tipTextSize="12sp" />

借此机会,我们也可以先看一下这个Banner最终的效果
在这里插入图片描述

3.代码中使用
首先是常规的两件套,创建对象和赋值

//java版
private XBanner mBanner;
mBanner = findViewById(R.id.xb_home_banner);
//kotlin版
private lateinit var banner: XBanner
banner = findViewById(R.id.xb_home_banner)

接下来如果我们是加载本地图片,可以使用XBanner提供的LocalImageInfo来实现,如下:

	List<LocalImageInfo> data = new ArrayList<>();
    data.add(new LocalImageInfo(R.drawable.banner_placeholder));
    data.add(new LocalImageInfo(R.drawable.banner_placeholder));
    data.add(new LocalImageInfo(R.drawable.banner_placeholder));
    data.add(new LocalImageInfo(R.drawable.banner_placeholder));
       

如果是网络请求需要的实体类的话,我们需要给banner传入轮播图数据,我们需要先创建一个类来继承接口(别问为什么,问就是作者要求的 bushi

//这是我按照玩安卓的接口返回的数据写的kotlin版的实体类,
//核心代码是实现BaseBannerInfo接口的getXBannerUrl()和getXBannerTitle()方法,
//把图片地址和标题传入
class BannerDataBean(
    desc: String,
    id: Int,
    imagePath: String,
    isVisible: Int,
    order: Int,
    title: String,
    type: Int,
    url: String
) : BaseBannerInfo {
    val desc = desc
    val id = id
    private val imagePath = imagePath
    val isVisible = isVisible
    val order = order
    private val title = title
    val type = type
    val url = url
    override fun getXBannerUrl(): Any {
        return imagePath
    }

    override fun getXBannerTitle(): String {
        return title
    }

}
//随手写的Java实体类,只保留了最核心的部分,其他网络请求的字段可以根据自己的需要添加
public static class EntryBean implements BaseBannerInfo {
            private String title;
            private String imageUrl;

            @Override
            public String getXBannerUrl() {
                return imageUrl;
            }

            @Override
            public String getXBannerTitle() {
                return title;
            }

           
        }

搞定实体类后,还有最后两步,注意,如果是加载本地图片,可以直接继续进行,如果是网络请求,需要在请求返回的响应中操作

首先要使用XBanner的setBannerData(),把上面准备好的data注入进去如下:

//加载本地的data,Java kotlin一致
mBanner.setBannerData(data);

第二个坑:在网络请求加载数据的时候,需要重新设置XBanner是否自动播放等等,完整的代码应该如下:

//刷新数据之后,需要重新设置是否支持自动轮播
mXBanner.setAutoPlayAble(data.size() > 1);
//设置模式是否为一屏多页(可选)
mXBanner.setIsClipChildrenMode(true);
mXBanner.setBannerData(data);
//设置轮播的动画,默认情况下一屏多页左右的图片不会缩放,更改动画可以改变轮播的效果,
//Transformer还有很多效果,感兴趣的朋友可以自行尝试
mXBanner.setPageTransformer(Transformer.Scale);

到这一步我们已经完成了注入数据,接着是最后一步,加载图片,我们可以选择自己喜欢的框架进行这一步,我这里采用Glide,在module下的build.gradle文件添加依赖:

implementation 'com.github.bumptech.glide:glide:4.13.2'

然后就是在代码中使用XBanner的loadImage()方法来加载准备好的图片

//Java版
banner.loadImage(new XBanner.XBannerAdapter() {
            @Override
            public void loadBanner(XBanner banner, Object model, View view, int position) {
            	//返回的图片路径为Object类型,你只需要强转成你传输的类型就行,切记不要胡乱强转!
            	//这里给的是加载上面的网络请求返回的数据
               EntryBean bean = ((EntryBean)model); 
               //本地请求请把EntryBean 换为 LocalImageInfo
               Glide.with(ListViewActivity.this).load(bean.getXBannerUrl()).placeholder(R.drawable.default_image).error(R.drawable.default_image).into((ImageView) view);
            }
        });
//kotlin版本,_为kotlin的省略参数的写法
banner.loadImage { _, model, view, _ ->
                        val bean = model as BannerDataBean
                        Glide.with(this@HomeActivity).load(bean.xBannerUrl)
                            .into(view as ImageView)
                    }

走到这里,我们就基本实现了自己的XBanner,当然,XBanner的功能远不止这些,除了上述的步骤,XBanner还提供了点击事件监听器setOnItemClickListener,自定义Banner,多布局使用等等实用的方法,值得后续继续研究。

此外,还有一个小技巧是在使用 XBanneractivityfragmentonResume() 中添加开启轮播的方法,在 onStop() 添加关闭轮播的方法,可以有效提高性能,如下:

//kotlin版本,Java与其类似
	override fun onResume() {
        super.onResume()
        banner.startAutoPlay()
    }

    override fun onStop() {
        super.onStop()
        banner.stopAutoPlay()
    }

总结

对于XBanner的使用介绍就是这些了,有问题的朋友可以直接下载XBanner的demo来继续学习,官方的demo地址如下 点我进入XBanner的Gthub页面下载,如果GitHub连接不稳定,也可以下载我上传的文件 点我下载XBannerdemo

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值