Android一步一步实现一款实用的Android广告栏

本文介绍了一位开发者如何基于现有的Android广告库,如daimajia的AndroidImageSlider和BGABanner,分析其不足并创建自己的广告栏组件。新组件强调实用性,包括无限轮播、自动手动滑动、自定义指示器样式和位置,同时支持本地和网络图片。开发者通过调整ViewPager的切换速度和实现自动切换功能,解决了原有库存在的问题。最后,分享了实现过程中的关键代码和遇到的挑战,鼓励读者动手实践。
摘要由CSDN通过智能技术生成

源码:BannerLayoutDemo

有图有真相:

bannerLayoutDemo

开源界有一句很有名的话叫“不要重复发明轮子”,当然,我今天的观点不是要反驳这句话,轮子理论给我们的开发带来了极大的便利,项目中要实现一些功能,便去网上找找,一般推荐使用一些有名的库,我本身也是这么做的,但我想说的是,既要会用轮子,也要知道轮子怎么造,必要的时候,自己也要造轮子(想要找到一个完全满意的轮子还是不大容易的)。

由来

之前项目里面都是用的daimajia的AndroidImageSlider,一开始被惊艳的动画切换效果吸引了,还有各种自定义属性动画啥的,感觉很棒,但随着项目的进展和时间的推移,我慢慢发现它也不是无所不能的,甚至我发现它只是好看,却不怎么实用,我列举一些我发现的问题:

  • 库中集成了Picasso,Picasso是极其耗内存的,这点我在之前的一篇为什么图片加载我首先Glide 提到过,当一个页面既有广告又有列表(列表中也一般有图片)会造成页面严重卡顿。
  • 动画效果太炫,实际项目中一个没用到,一般用标准模式。
  • 太多的依赖包,现在的许多项目都是基于android4.0以上版本开发的,nineoldandroid已经不需要了
  • 页面点击事件不直观,如果有那种像ListView的OnItemClickListener就好了

总而言之,我感觉它现在已经有些臃肿。当然,我也在网上寻找更简洁实用的替代库,比如BGABanner-Android,但事实也是残酷的,不支持网络图片,还有一个坑等着我跳,看代码片段

1
2
3
if (mAutoPlayAble && views.size() <  3 ) {
       throw new IllegalArgumentException( "开启指定轮播时至少有三个页面" );
}

低于3张图片会直接抛异常,这叫我怎么用,需求也不是我能控制的。

当然以上两个库的作者我都很喜欢,这两个库也非常不错,不然也不值得我花时间研究。

我对轮子的要求

结合自己的理解,我认为两个库中都有可取之处,也有不足之处,我就取长补短,造自己的轮子,我对这个轮子的要求:

  • 无限轮播
  • 自动加手动滑动
  • 简单的自定义指示器样式及位置
  • 支持本地图片及网络图片
  • 滑动流畅,无卡顿,无闪烁
  • 广告页面不限制个数
  • 页面点击监听事件
  • 简单易用,高配置,无明显bug
    动画效果我先打算抛弃了,默认的就好,以实用为主。

Gradle Dependency

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    compile 'com.github.dongjunkun:BannerLayout:1.0.0'
}

使用

xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
< com.yyydjk.library.BannerLayout
         android:id = "@+id/banner"
         android:layout_width = "match_parent"
         android:layout_height = "200dp"
         app:autoPlayDuration = "5000"
         app:indicatorMargin = "10dp"
         app:indicatorPosition = "rightBottom"
         app:indicatorShape = "rect"
         app:indicatorSpace = "3dp"
         app:scrollDuration = "1100"
         app:selectedIndicatorColor = "?attr/colorPrimary"
         app:selectedIndicatorHeight = "6dp"
         app:selectedIndicatorWidth = "6dp"
         app:unSelectedIndicatorColor = "#99ffffff"
         app:unSelectedIndicatorHeight = "6dp"
         app:unSelectedIndicatorWidth = "6dp" />

代码中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
//网络地址
bannerLayout.setViewUrls(urls);
 
//本地资源
bannerLayout.setViewRes(viewRes);
 
//添加点击监听
bannerLayout.setOnBannerItemClickListener( new BannerLayout.OnBannerItemClickListener() {
             @Override
             public void onItemClick( int position) {
                 Toast.makeText(MainActivity. this , String.valueOf(position), Toast.LENGTH_SHORT).show();
             }
         });
</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值