寫(xiě)在前面:
此庫(kù)源于公司項(xiàng)目需求,暫時(shí)無(wú)法提供maven地址供大家使用精绎,此處會(huì)給源碼GitHub鏈接代碼部分修改可直接運(yùn)行速缨。
庫(kù)鏈接:https://github.com/XMDstar/TimeAlbum
頁(yè)面搭建以及使用庫(kù):
頁(yè)面實(shí)現(xiàn)基于需求使用RecyclerView嵌套R(shí)ecyclerView
圖片加載使用Google所推薦的圖片加載庫(kù)Glide
線(xiàn)程間以及組件間通信使用EventBus
視頻播放使用ijkplayer
圖片+視頻預(yù)覽頁(yè)布局使用ViewPager+PhotoView ?PhotoView可以根據(jù)顯示控件的大小較為高度的還原圖片原本尺寸比例大小,用作預(yù)覽圖片還原度較高
主要類(lèi)說(shuō)明:
MaterialBean為數(shù)據(jù)實(shí)體類(lèi)代乃,TimeAlbumActivity為相冊(cè)圖片+視頻Activity旬牲,AlbumPreviewActivity為視頻或圖片預(yù)覽Activity,AlbumData和AlbumSplitData是根據(jù)需求以MaterialBean為核心添加輔助屬性適配成可用數(shù)據(jù)實(shí)體類(lèi)搁吓。需要注意的是MaterialBean中的type屬性 ?
1.photo 2.video 3.進(jìn)入相機(jī)拍攝占位 4.添加更多圖片占位(4為項(xiàng)目需求添加可不使用)
其中最為核心的類(lèi)是AlbumUtils和SplitUtils類(lèi)原茅,下面大概說(shuō)一下實(shí)現(xiàn)思路以及重要代碼展示:
AlbumUtils:相冊(cè)數(shù)據(jù)讀取以及按照時(shí)間排序并且封裝成為用于展示的AlbumData類(lèi)的工具類(lèi)。
List<AlbumData>?getFormatData(ArrayList<MaterialBean> beans,?String type)方法可以將傳入的視頻+圖片數(shù)據(jù)格式化為我們后面展示使用的 日期+該日期下的視頻與圖片集合 此方法中beans代表已經(jīng)按照時(shí)間由近到遠(yuǎn)排序的數(shù)據(jù)集合(排序使用上述getSortData()方法可得到)堕仔,type為是否添加進(jìn)入相冊(cè)拍照占位(通常將占位添加到數(shù)據(jù)首位)擂橘。
SplitUtils:拆分工具類(lèi),一類(lèi)按照時(shí)間拆分摩骨,二類(lèi)按照選擇順序拆分通贞。
基本拆分邏輯:將選擇集合拆分為視頻集合與圖片集合再根據(jù)規(guī)則將視頻集合與圖片集合進(jìn)行提取產(chǎn)生最終所需集合,按照時(shí)間拆分邏輯基本不變只是在此之前需按照時(shí)間進(jìn)行排序仿吞。(拆分為需求所用可忽略)
getSplitdata?中需要參數(shù)分別為選擇的視頻集合以及圖片集合滑频,isAddImg是判斷是否需要在拆分單元不滿(mǎn)的情況下添加一個(gè)可添加圖片占位(此處為需求添加,大多數(shù)情況不需要)唤冈。
拆分工具類(lèi)中有對(duì)選擇集合進(jìn)行拆分為視頻集合與圖片集合的方法峡迷,此處沒(méi)有在選擇的時(shí)候就將其區(qū)分主要是方便處理選中與取消選中以及置灰取消置灰的控制。
時(shí)間相冊(cè)頁(yè)面優(yōu)化防止卡頓策略:
1.使用RecyclerView.RecycledViewPool減少創(chuàng)建ViewHolder的開(kāi)銷(xiāo)?
2.嵌套內(nèi)部RecyclerView禁止滑動(dòng)并開(kāi)啟自適應(yīng)item高度,取消嵌套內(nèi)部獲得焦點(diǎn)防止第一條item圖片過(guò)多自動(dòng)上移問(wèn)題绘搞,開(kāi)啟setHasFixedSize避免重復(fù)計(jì)算item大小彤避,屏蔽RecyclerView自身默認(rèn)動(dòng)畫(huà),防止刷新閃屏問(wèn)題
3.Glide的簡(jiǎn)單使用方法如下夯辖,Glide有很好的內(nèi)存管理以及緩存機(jī)制可以很好的防止OOM琉预,對(duì)于相冊(cè)中有大量圖片視頻的用戶(hù)來(lái)說(shuō)是一個(gè)很不錯(cuò)的選擇并且它對(duì)于加載視頻第一幀相比原生MediaMetadataRetriever方式支持格式更加全面,此處設(shè)置了預(yù)加載蒿褂、加載失敗圆米、URL為null情況下的默認(rèn)圖并對(duì)加載圖片進(jìn)行了300×300的裁剪很好防止某日期下圖片巨多情況下此天滑動(dòng)卡頓的問(wèn)題
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);
使用說(shuō)明:
進(jìn)入相冊(cè)需要傳入1.視頻+圖片選擇上限,2.視頻選擇上限啄栓,3.是否顯示拆分彈框娄帖,根據(jù)需求默認(rèn)視頻+圖片上限50,視頻上限10相冊(cè)返回選中數(shù)據(jù)集合以及是否按照時(shí)間拆分昙楚,后續(xù)可根據(jù)返回?cái)?shù)據(jù)使用拆分工具類(lèi)進(jìn)行拆分
待優(yōu)化雞肋問(wèn)題:
點(diǎn)擊視頻圖片進(jìn)入預(yù)覽頁(yè)面當(dāng)點(diǎn)擊視頻開(kāi)始播放后滑動(dòng)預(yù)覽下張圖片或者視頻時(shí)要將播放視頻停止播放并置為初始狀態(tài)近速,解決方式如下圖,此處處理方式雖然可以實(shí)現(xiàn)需求堪旧,但是自身感覺(jué)較為不妥削葱,待改進(jìn)。
有問(wèn)題以及建議歡迎留言淳梦,蟹蟹析砸。