可以使用Build Scan(Terminal下执行gradlew build --scan)分析构建情况(相关配置在settings.gradle中) 注:测试发现多渠道Build Scan貌似无法成功,可以关闭多渠道到进行Build Scan
三方库 | 描述 |
---|---|
Timber | JakeWharton大神的Log打印工具 |
AndroidUtilCode | 超强工具合集 |
AndroidAutoSize | 今日头条UI适配方案 |
ImmersionBar | 状态栏和虚拟导航栏、全面屏+刘海屏适配、键盘监听 |
MMKV | 腾讯推出的替代SharedPreferences的更高效方案 |
Coroutines | Kotlin协程,替代Rxjava |
OkhttpLog | 美化OKhttp请求和响应打印日志 |
RxHttp | 新一代OkHttp请求神器,自带缓存策略,兼容Kotlin协程 |
RxAndroid | Android链式调用Rxjava |
Coil | Kotlin版本的图片加载(内置高斯模糊和黑白化功能) |
MultiType | 多类型适配器与Epoxy类似(积木搭建式) |
XXpermissions | 兼容最新安卓11的权限请求框架 |
LiveEventBus | 跨进程通信、跨APP通信、自动取消订阅 |
AgentWeb | 简化WebView加载 |
Itemanimators | RecyclerView动画局部刷新动画 |
DslTabLayout | 样式齐全的ViewPager指示器 |
SmartSwipe | 仿微信、小米侧滑返回 |
SmartRefresh | 下拉刷新,兼容性和效果比SmartSwipe好 |
CacheEmulatorChecker | 模拟器检测工具 |
Leakcanary | 内存泄漏检测工具 |
Uinspector | 取代LayoutInspector的UI调试工具(仅限Debug模式) |
PictureSelector | 强悍的图片选择,大图预览工具 |
Emoji | 聊天Emoji表情选择面板 |
SideBar | 通讯录侧边栏SideBar |
FlexboxLayout | 谷歌推出的标签展示控件(Recycler流式布局) |
DKPlayer | UI封装比较美观的播放器 |
Lottie | AE动画库 |
TinyPinyin | 中文转拼音工具 |
DatePickerView | 基于RecyclerView的滚轮选择器(Koltin编写) |
SpEditTool | 微博@和#变色效果 |
DiscreteScrollView | 实现无限轮播Banner、ViewPager横竖屏滑动等 |
Walle | 美团瓦力打包(Bat批量打包+说明) |
=============================== | =============================== |
//================================================================//
//================================================================//
override fun fillData(holder: BaseViewHolder<ItemBannerBinding>, item: MutableList<BannerBean>) {
if (holder.itemView.getTag(R.id.tag_banner) != item) {
holder.itemView.setTag(R.id.tag_banner, item)
val banner = holder.itemView.findViewById<DiscreteBanner<BannerBean, ItemBannerImgBinding>>(R.id.itemBanner)
banner.layoutParams.height = (ScreenUtils.getScreenWidth() * 500f / 900).toInt()
banner.setLooper(true) //无限循环
.setAutoPlay(true) //自动播放
.setOrientation(if (System.currentTimeMillis() % 2 == 0L) DSVOrientation.HORIZONTAL else DSVOrientation.VERTICAL)
.setOnItemClick { position, t -> onItemBannerClick?.invoke(t, position) } //banner点击
.apply {
getIndicator()?.needSpecial = false //去除引导页的特殊指示器
if (getOrientation() == DSVOrientation.HORIZONTAL.ordinal) { //由于默认是横向原点居底部(引导页使用),所以banner处修改为底部居右
setIndicatorGravity(Gravity.BOTTOM or Gravity.END)
setIndicatorOffsetY(-defaultOffset / 2f)
setIndicatorOffsetX(-defaultOffset)
}
}
.setPages(object : DiscretePageAdapter<BannerBean, ItemBannerImgBinding>(item) {
override fun fillData(data: BannerBean, binding: ItemBannerImgBinding, position: Int, count: Int) {
binding.itemBannerImg.loadImgHorizontal(data.imagePath, 900f / 500)
}
}, item) //BannerBean的数据列表MutableList<BannerBean>
}
}
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//
//================================================================//