Android 高仿QQ圖片選擇器
當(dāng)做一款A(yù)PP,需要選擇本地圖片時(shí),首先考慮的無(wú)疑是系統(tǒng)相冊(cè),但是Android手機(jī)五花八門(mén),再者手機(jī)像素的提升,大圖無(wú)法返回等異常因數(shù),導(dǎo)致適配機(jī)型比較困難,微信、QQ都相繼的在自己的APP里集成了圖片選擇功能,放棄了系統(tǒng)提供的圖片選擇器,這里仿造QQ做了一個(gè)本地圖片選擇器,PS:之前有人說(shuō)"仿"寫(xiě)成“防”了,今兒特意注意了下,求不錯(cuò)。
先上一張效果圖,無(wú)圖無(wú)真相啊~~~
實(shí)現(xiàn)的效果大概是這樣的:
1.單選:跳轉(zhuǎn)到本地圖片選擇文件夾,選擇文件夾后,進(jìn)入到該文件夾下的所有圖片,選擇某張圖片后,返回改圖片地址信息
2.多選:跳轉(zhuǎn)到圖片文件夾,選擇一個(gè)文件夾,選擇圖片,點(diǎn)擊右上角的小圓圈,選中該圖,點(diǎn)擊圖片其他區(qū)域,查看大圖,點(diǎn)擊預(yù)覽,查看已選圖片,可以跨文件夾選擇圖片。
為了達(dá)到這效果,需要做幾件事:
1.讀取本地所有 有圖片的文件夾:
這里用ContentResolver讀取媒體文件
String[] columns = {MediaStore.Images.Media._ID, MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID, MediaStore.Images.Media.BUCKET_DISPLAY_NAME, "COUNT(1) AS count"}; String selection = "0==0) GROUP BY (" + MediaStore.Images.Media.BUCKET_ID; String sortOrder = MediaStore.Images.Media.DATE_MODIFIED; Cursor cursor = contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, selection, null, sortOrder);
這是一個(gè)簡(jiǎn)單的SQL查詢語(yǔ)句,按文件夾分組,并返回文件夾下圖片數(shù)。
2.讀取指定文件夾下所有圖片:
當(dāng)選擇某一目錄時(shí),需要讀取該目錄下所有圖片了。
String[] columns = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA}; /*查詢文件路徑包含上面指定的文件夾路徑的圖片--這樣才能保證查詢到的文件屬于當(dāng)前文件夾下*/ String whereclause = MediaStore.Images.ImageColumns.DATA + " like'" + folderPath + "/%'"; Log.i("queryGalleryPicture", "galleryPath:" + folderPath); Cursor corsor = c.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, whereclause, null, null);
這里的查詢語(yǔ)句是根據(jù)文件名字來(lái)過(guò)濾的,只要圖片路徑包含文件夾路徑的,則為該文件夾下的圖片
3.UI交互
首先在展示所有包含圖片的文件夾時(shí),異步加載有圖片的文件夾,讀取成功后列表展示,這里用的RecyclerView展示列表信息,點(diǎn)擊某一目錄時(shí),在讀取改目錄下的圖片,在圖片展示頁(yè)里,需要注意的是,每次點(diǎn)擊判斷當(dāng)前點(diǎn)擊圖片是否已在選擇列表中,若在,刪除,不在,添加。這里圖片加載用了開(kāi)源框架ImageLoader
if (mSelectlist.contains(imageBean)) { //點(diǎn)擊的item為已選過(guò)的圖片時(shí),刪除 mSelectlist.remove(imageBean); subSelectPosition(); } else { //不在選擇列表里,添加 if (mSelectlist.size() >= maxCount) { Toast.makeText(mContext, mContext.getResources().getString(R.string.publish_select_photo_max, maxCount), Toast.LENGTH_SHORT).show(); return; } mSelectlist.add(imageBean); imageBean.selectPosition = mSelectlist.size(); } //通知點(diǎn)擊項(xiàng)發(fā)生了改變 notifyItemChanged(position);
同時(shí)沒(méi)刪除一張圖片,圖片上的序號(hào)相應(yīng)的作改變,然后通知改變項(xiàng)更新UI。
不同Activity跳轉(zhuǎn)時(shí),因?yàn)橐獋鬟f圖片列表List,list里是自定義實(shí)體類,剛開(kāi)始考慮過(guò)用intent傳遞,但是intent傳遞后,通過(guò)list.get(positon).contains比較是否同一對(duì)象時(shí),始終是不同對(duì)象,大家可以去驗(yàn)證下。所以這里定義了一個(gè)觀察者的類,去保存選擇的圖片和文件夾下的所有圖片,同時(shí)查看大圖時(shí),若選擇了一張或者取消選擇了一張圖,通過(guò)觀察者通知更新即可
/** * 通知圖片選擇已改變 */ public void updateImageSelectChanged () { setChanged(); notifyObservers(imgSelectObj); }
好了,有了以上的,就可以使用我們的圖片選擇器了:
單選時(shí),在需要的地方調(diào)用:
/*單選,參數(shù)對(duì)應(yīng)的是context, 回調(diào)*/ FolderListActivity.startSelectSingleImgActivity(this, 2); 多選時(shí): /*參數(shù)對(duì)應(yīng)context, 回調(diào)code, 傳入的圖片List, 可選的最大張數(shù)*/ FolderListActivity.startFolderListActivity(this, 1, null, 9);
最后Activity的onActivityResult中接收返回的圖片數(shù)據(jù):
List<ImageFolderBean> list = (List<ImageFolderBean>) data.getSerializableExtra("list");
源碼下載地址:
https://github.com/JarekWang/photoselect
以上所述是小編給大家介紹的Android 高仿QQ圖片選擇器的全部敘述,希望對(duì)大家有所幫助!
相關(guān)文章
Android編程之Application設(shè)置全局變量及傳值用法實(shí)例分析
這篇文章主要介紹了Android編程之Application設(shè)置全局變量及傳值用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了全局變量及傳值的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12Android使用ExpandableListView實(shí)現(xiàn)三層嵌套折疊菜單
這篇文章主要介紹了Android使用ExpandableListView實(shí)現(xiàn)三層嵌套折疊菜單,對(duì)布局感興趣的同學(xué)可以參考下2021-04-04基于Android中獲取資源的id和url方法總結(jié)
下面小編就為大家分享一篇基于Android中獲取資源的id和url方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Android 使用Shell腳本截屏并自動(dòng)傳到電腦上
這篇文章主要介紹了Android 使用Shell腳本截屏并自動(dòng)傳到電腦上的相關(guān)資料,需要的朋友可以參考下2016-02-02Android貝塞爾曲線實(shí)現(xiàn)消息拖拽消失
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線實(shí)現(xiàn)消息拖拽消失,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01Android中RecyclerView實(shí)現(xiàn)橫向滑動(dòng)代碼
這篇文章主要介紹了Android中RecyclerView實(shí)現(xiàn)橫向滑動(dòng)代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07使用SharedPreferences在Android存儲(chǔ)對(duì)象詳細(xì)代碼
這篇文章主要介紹了使用SharedPreferences在Android存儲(chǔ)對(duì)象并附上詳細(xì)代碼,下面文章內(nèi)容較少,大多以代碼的形式體現(xiàn),需要的小伙伴可以參考一下,希望對(duì)你有所幫助2021-11-11Android 實(shí)現(xiàn)沉浸式狀態(tài)欄的方法
沉浸式狀態(tài)欄的來(lái)源就是很多手機(jī)用的是實(shí)體按鍵,沒(méi)有虛擬鍵,于是開(kāi)了沉浸模式就只有狀態(tài)欄消失了。下面腳本之家小編給大家介紹Android 實(shí)現(xiàn)沉浸式狀態(tài)欄,需要的朋友可以參考下2015-09-09Android實(shí)現(xiàn)按鈕點(diǎn)擊效果
本文主要介紹了Android實(shí)現(xiàn)按鈕點(diǎn)擊效果:第一次點(diǎn)擊變色,第二次恢復(fù)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02