灵活布局的Banner组件

项目地址
最近有空闲时间将之前项目中实现的部分自定义组件整理一下分享出来,希望对其他人有有用

需求:

 1.实现一个轮播图2.轮播图尺寸为按宽高比例显示(比例指定)3.轮播图根据数据区分显示图片(图片可以点击跳转)还是图片上显示3个商品信息(且商品可以点击跳转)4.轮播图的停留时间不固定,有商品的itme停留时间为纯图片的3倍

拿到这个需求当时想到使用Banner库并修改,但是考虑一下实现起来困难比较大,所以就想着横向的RecyclerView实现但是怎样控制像ViewPager一样整页滑动呢?通过搜索发现了SnapHelper这个类,至于SnapHelper详细作用自己通过连接了解一下,并且在搜索资料过程中发现了Android-ConvenientBanner的实现,自己也借鉴了作者的部分代码

使用

1.在项目根build.gradle中添加如下代码

allprojects {
repositories {

maven { url “https://jitpack.io” }
}
}

2. 在使用的Module中添加如下引用

implementation ‘com.github.rupertoL:SpecialView:1.1’
如果需要使用AndroidX的换请引用 implementation ‘com.github.rupertoL:SpecialView:vX1.1’

项目配置就完成了接下来就是用了

单纯的Banner图使用

初始化:


mFlexibleBanner
.setPages(new DefaultImageBannerHolder(15), mBannerUrlLists) //设置默认的Holder和数据源
.startTurning(); //启动轮播
getLifecycle().addObserver(mFlexibleBanner); //添加Lifecycle检测 添加后如果是自动轮播那么在 onPause停止 在onResume开始轮播 

更新数据:


mFlexibleBanner.update(mBannerUrlLists);

单纯的图片轮播就搞定了

自己实现图片轮播的布局

mFlexibleBanner3.setPages(new ItmeBuildImpi() {@Overridepublic FlexibleBannerHolder createViewHolder(ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(getBaseContext()).inflate(R.layout.banner_item, parent, false);return new TestLocalImageHolderView(itemView);}@Overridepublic int getItemViewType(Object t) {return 0;}}, mBanner3UrlLists); //设置默认的Holder和数据源

自己适配布局需要实现 ItmeBuildImpi 接口并且重写createViewHolder 与getItemViewType方法
其中createViewHolder接口返回一个FlexibleBannerHolder 对象

public class TestLocalImageHolderView extends FlexibleBannerHolder {public TestLocalImageHolderView(View itemView) {super(itemView);}//初始化布局@Overrideprotected void initView(View itemView) {mItemView = itemView;imageView = itemView.findViewById(R.id.iv_banner);}//UI更新@Overridepublic void updateUI(Object data) {Glide.with(mItemView.getContext()).load(data.toString()).apply(RequestOptions.bitmapTransform(new RoundedCorners(30))).into(imageView);}private ImageView imageView;private View mItemView;
}

数据更新:


mFlexibleBanner3.update(mBannerUrlLists);

多个布局样式

初始化布局:

mFlexibleBanner2.setPages(new ItmeBuildImpi() {@Overridepublic FlexibleBannerHolder createViewHolder(ViewGroup parent, int viewType) {//返回布局类型1if (viewType == 1) {View itemView = LayoutInflater.from(getBaseContext()).inflate(R.layout.banner_item, parent, false);return new TestLocalImageHolderView1(itemView);} else {//返回布局样式2View itemView = LayoutInflater.from(getBaseContext()).inflate(R.layout.banner2_item, parent, false);return new TestLocalImageHolderView2(itemView);}}@Overridepublic int getItemViewType(Object t) {//根据数据返回布局样式类型Banner banner = (Banner) t;return banner.getType();}}, mBanner2UrlLists);

FlexibleBannerHolder 的实现与TestLocalImageHolderView 一样根据布局样式展示不通数据

数据更新:


mFlexibleBanner2.update(mBannerUrlLists);

更多的配置

  • setPageIndicatorAlign(IndicatorConfig align) 设置指示器的位置
  • setPageIndicator(int[] page_indicatorId) 指示器的样式第一个为默认,第二个为选中状态
  • setPageIndicatorMargin(int marginLeft, int marginRight, int marginTop, int marginBottom) 指示器的Margin
  • setPageIndicatorPadding(int paddingLeft, int paddingRight, int paddingTop, int paddingBottom) 指示器的Padding
  • setLoopTask(BannerLoopTaskImpl bannerLoopTask) 自定义轮播机制
  • setAutoSwitch(boolean autoSwitch) 是否自动轮播 默认自动轮播

xml配置:

  1. auto_switch 是否自动轮播 默认true
  2. alone_auto_switch 一个对象时是否轮播 默认false
  3. distance_time 轮播时间间隔 默认5000
  4. aspect_ratio 宽高比 默认-1 不支持宽高比
  5. slide_velocity 一个像素滑动的时间 默认30f

后期将会将其他的组件整理出来

灵活布局的Banner组件相关推荐

  1. 广告位banner组件

    原文:http://blog.csdn.net/singwhatiwanna/article/details/8875241 原理 参见下图.整个组件是一个FrameLayout,里面有两个view, ...

  2. dorado:AutoForm中的灵活布局!

    dorado:AutoForm中的灵活布局! (2011-02-21 12:00:04) 转载▼ 标签: it   场景描述: 本例使用AuotForm组件实现不同的排版布局,以实现应用当中遇到不同的 ...

  3. 【鸿蒙 HarmonyOS】Ability 中使用纯代码绘制布局及 UI 组件

    文章目录 一.Ability 与 Slice 简介 二.Ability 中使用纯代码绘制布局及 UI 组件 三.Ability 中使用纯代码绘制布局及 UI 组件代码示例 四.GitHub 地址 一. ...

  4. 【约束布局】ConstraintLayout 组件可见性 View.GONE 处理 与 Margin 属性 ( 约束布局可见性处理 | goneMargin 属性 )

    文章目录 I . 相对定位 Margin 属性 II . 可见性改变后的行为处理 ( Visibility Behavior ) III . 组件设置 GONE 属性示例 被 约束到不可见组件 后 M ...

  5. vue商城项目开发:封装banner组件、组件参数传递

    封装banner组件 在Home组件中引入: components: 在template中使用: 组件参数传递 轮播图可以封装成组件,但是每个页面要展示的图片内容可能不一样,所以要进行参数传递,你传什 ...

  6. Angular实现灵活的动态创建组件指令

    Angular实现灵活的动态创建组件指令 在某些场景下需要动态创建指令,但是不想每次都要写很多重复的代码,那么封装一个灵活的指令是比较好的方式. 本文代码库已经在github上 ngx-dyncmp ...

  7. 组件用.vue还是.js_如何使用Vue.js 2.0构建灵活的图像上传器组件

    组件用.vue还是.js by Cathy Ha 由凯茜·哈(Cathy Ha) 如何使用Vue.js 2.0构建灵活的图像上传器组件 (How to build a flexible image u ...

  8. java flowlayout参数_【Java布局】FlowLayout布局时设定组件大小

    默认的JPanel中,采用的是FlowLayout布局 下面是api中的定义: JPanel(boolean isDoubleBuffered) 创建具有 FlowLayout 和指定缓冲策略的新 J ...

  9. 窗口管理器 实现_「42」Python布局管理器(三):place实现组件的精确与灵活布局...

    已经学习了两类布局管理器: Pack布局管理器:按照垂直或者水平的方向自然排布: Grid布局管理器:采用表格结构组织组件,组件位置受限表格形式. 两类管理器都属于那种很古板的布局方式,不能适应需要相 ...

  10. android表格布局最后一个组件,Android布局之TableLayout表格布局

    Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件.当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列 ...

最新文章

  1. XAF-Domain Components 技术 使用接口来定义ORM业务对象
  2. PYQT中QThread输出到textBrowser
  3. 汇编原理实验 --类型统计(字母,数字,其他字符的个数)
  4. CentOS 安装过程中格式化 SATA 硬盘巨慢的问题
  5. Java项目课程01:课程概述
  6. canvas综合应用绘制哆啦A梦
  7. 公交车上应不应该给老人让座?
  8. 活锁(live lock)是什么
  9. DDS文档数据库服务
  10. 遗传算法适应度计算函数——ranking
  11. 云计算的运营方式有这三种
  12. 【jzoj5289】【NOIP2017提高组A组模拟8.17】【偷笑】【数据结构】
  13. 电脑:键盘快捷键的更改(主要以dell笔记本电脑为模拟对象)
  14. Linux 服务具体解释
  15. 解决android键盘顶布局导致布局错乱(华为 oppo手机弹框问题)
  16. android gradle 版本部队,gradle中统一配置版本的小技巧。
  17. c语言程序警告不能打开文件,Win10安装程序提示“不能打开要写入的文件”如何解决...
  18. Dplayer实现弹幕功能
  19. DNS的DDOS攻击
  20. Spring事务传播性(较详细描述)

热门文章

  1. 35种神奇的心理效应
  2. C#发送邮件 SMTP
  3. Java数据结构与算法
  4. 单片机控制光耦开关继而控制电机转动
  5. android相机网格,Android – 在相机上显示网格线
  6. 三菱Q系列plc11轴运动控制程序
  7. 使用postman测试图片上传
  8. React.js介绍
  9. WIN2008R2修改远程桌面端口(不重启系统)
  10. W806串口管脚复用