写在前面:
此库源于公司项目需求,暂时无法提供maven地址供大家使用,此处会给源码GitHub链接代码部分修改可直接运行。
库链接:https://github.com/XMDstar/TimeAlbum
页面搭建以及使用库:
页面实现基于需求使用RecyclerView嵌套RecyclerView
图片加载使用Google所推荐的图片加载库Glide
线程间以及组件间通信使用EventBus
视频播放使用ijkplayer
图片+视频预览页布局使用ViewPager+PhotoView PhotoView可以根据显示控件的大小较为高度的还原图片原本尺寸比例大小,用作预览图片还原度较高
主要类说明:
MaterialBean为数据实体类,TimeAlbumActivity为相册图片+视频Activity,AlbumPreviewActivity为视频或图片预览Activity,AlbumData和AlbumSplitData是根据需求以MaterialBean为核心添加辅助属性适配成可用数据实体类。需要注意的是MaterialBean中的type属性
1.photo 2.video 3.进入相机拍摄占位 4.添加更多图片占位(4为项目需求添加可不使用)
其中最为核心的类是AlbumUtils和SplitUtils类,下面大概说一下实现思路以及重要代码展示:
AlbumUtils:相册数据读取以及按照时间排序并且封装成为用于展示的AlbumData类的工具类。
List<AlbumData> getFormatData(ArrayList<MaterialBean> beans, String type)方法可以将传入的视频+图片数据格式化为我们后面展示使用的 日期+该日期下的视频与图片集合 此方法中beans代表已经按照时间由近到远排序的数据集合(排序使用上述getSortData()方法可得到),type为是否添加进入相册拍照占位(通常将占位添加到数据首位)。
SplitUtils:拆分工具类,一类按照时间拆分,二类按照选择顺序拆分。
基本拆分逻辑:将选择集合拆分为视频集合与图片集合再根据规则将视频集合与图片集合进行提取产生最终所需集合,按照时间拆分逻辑基本不变只是在此之前需按照时间进行排序。(拆分为需求所用可忽略)
getSplitdata 中需要参数分别为选择的视频集合以及图片集合,isAddImg是判断是否需要在拆分单元不满的情况下添加一个可添加图片占位(此处为需求添加,大多数情况不需要)。
拆分工具类中有对选择集合进行拆分为视频集合与图片集合的方法,此处没有在选择的时候就将其区分主要是方便处理选中与取消选中以及置灰取消置灰的控制。
时间相册页面优化防止卡顿策略:
1.使用RecyclerView.RecycledViewPool减少创建ViewHolder的开销
2.嵌套内部RecyclerView禁止滑动并开启自适应item高度,取消嵌套内部获得焦点防止第一条item图片过多自动上移问题,开启setHasFixedSize避免重复计算item大小,屏蔽RecyclerView自身默认动画,防止刷新闪屏问题
3.Glide的简单使用方法如下,Glide有很好的内存管理以及缓存机制可以很好的防止OOM,对于相册中有大量图片视频的用户来说是一个很不错的选择并且它对于加载视频第一帧相比原生MediaMetadataRetriever方式支持格式更加全面,此处设置了预加载、加载失败、URL为null情况下的默认图并对加载图片进行了300×300的裁剪很好防止某日期下图片巨多情况下此天滑动卡顿的问题
Glide.with(mContext).load(new File(bean.getPath())).error(R.drawable.image_placeholder)
.placeholder(R.drawable.image_placeholder).fallback(R.drawable.image_placeholder).override(300,300).into(holder.img);
使用说明:
进入相册需要传入1.视频+图片选择上限,2.视频选择上限,3.是否显示拆分弹框,根据需求默认视频+图片上限50,视频上限10相册返回选中数据集合以及是否按照时间拆分,后续可根据返回数据使用拆分工具类进行拆分
待优化鸡肋问题:
点击视频图片进入预览页面当点击视频开始播放后滑动预览下张图片或者视频时要将播放视频停止播放并置为初始状态,解决方式如下图,此处处理方式虽然可以实现需求,但是自身感觉较为不妥,待改进。
有问题以及建议欢迎留言,蟹蟹。