記得剛開始做Andriod項目那會,經常會碰到一些上傳圖片的功能需求,特別是社交類的app,比如用戶頭像,說說配圖,商品配圖等功能都需要讓我們到系統相冊去選取圖片,但官方卻沒有提供可以選取多張圖片的相關API,所以那時候會到Github上去找找相關的開源庫,也覺得挺方便的,但隨著后來Android系統的更新,帶來了很多新特性和API的改變,比如從Android6.0后的動態權限申請,7.0的私有目錄權限以及一些API的廢棄(Uri.fromFile等),但所用的開源庫作者又沒有很及時的去更新適配,又或者一些開源庫直接在庫中引入了圖片加載框架,導致項目中存在多個圖片加載框架,這樣就造成了包體積的增大和方法數的增加,導致項目中或多或少會出現一些問題,所以那時萌生了想自己寫一個圖片選擇器,盡可能的做到簡潔,速度快,然后一個圖片選擇器的庫就這么誕生了:ImagePicker圖片加載器
實現效果圖:
相比1.0.+版本,2.0版本進行了代碼的大塊重構,注重模塊間的代碼解耦,簡化了配置,將兼容Android7.0所需要的FileProvider下沉到庫中完成,不再需要開發者配置,并對GIF圖,視頻,大圖預覽等功能有了支持。
1、如何在項目中引入該圖片加載庫:
//gradle版本在3.0以下引入此行
compile 'com.lcw.library:imagepicker:2.2.0'
//gradle版本在3.0以上引入此行
implementation 'com.lcw.library:imagepicker:2.2.0'
2、一行代碼調用:
ImagePicker.getInstance()
.setTitle("標題")//設置標題
.showCamera(true)//設置是否顯示拍照按鈕
.showImage(true)//設置是否展示圖片
.showVideo(true)//設置是否展示視頻
.setSingleType(true)//設置圖片視頻不能同時選擇
.setMaxCount(9)//設置最大選擇圖片數目(默認為1,單選)
.setImagePaths(mImageList)//保存上一次選擇圖片的狀態,如果不需要可以忽略
.setImageLoader(new GlideLoader())//設置自定義圖片加載器
.start(MainActivity.this, REQUEST_SELECT_IMAGES_CODE);//REQEST_SELECT_IMAGES_CODE為Intent調用的requestCode
3、如何獲取選中的圖片集合:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SELECT_IMAGES_CODE && resultCode == RESULT_OK) {
List<String> imagePaths = data.getStringArrayListExtra(ImagePicker.EXTRA_SELECT_IMAGES);
}
}
4、如何自定義圖片加載器(不定死框架,讓框架更加靈活,需要去實現ImageLoader接口即可):
public class GlideLoader implements ImageLoader {
//to do something 可以參考Demo用法
}
寫在最后:
這個庫會持續維護下去,后續會把大圖預覽,裁剪等功能添加進去,遵循極簡的原則,把庫做的盡可能的小,歡迎大家提建議,更加具體的使用請參考下面源碼中的Demo演示~
版本更新里程碑:
Version1.0.0:
1、可預覽各文件夾下的圖片
2、可配置是否支持相機拍照
3、可配置選擇圖片模式(單選/多選)
4、可配置選擇圖片數量 5、可配置圖片加載框架
Version1.1.0:
1、新增大圖預覽功能(初步實現,考慮性能后期會改為Fragment承載,單一Activity架構)
2、更改選擇圖片文件夾彈窗高度
3、更改ImageLoader接口,開放小圖加載、大圖加載、清除緩存方法
Version2.0.0:
1、重構了大量的代碼,更加注重代碼間的解耦,相比1.0版本簡化了配置項(下沉FileProvider),讓開發者可以更專注于業務。
2、添加媒體庫掃描對GIF、視頻的支持,并開放接口讓開發者自行實現視頻播放邏輯。
3、添加媒體庫加載策略,開發者可自行配置加載圖片或者視頻,靈活運用于不同業務實現。
4、完善大圖預覽功能,完善部分UI界面的顯示。
源碼下載:
這里附上源碼地址(歡迎Star,歡迎Fork):ImagePicker