輕量級圖片選擇框架,多選,拍照,支持剪裁,自定義圖片加載android
圖片選擇框架其實已有許多優秀成熟的框架,好比知乎開源的 Matisse,遵循Google提倡的MaterialDesign ,感興趣的朋友能夠查看看下這篇文章,對Matisse的使用有一個粗略的認識。git
既然已經有了這麼優化的框架爲啥還要重複造輪子呢,估計不少讀者都有這樣的疑問,對於這個問題我想說如下幾點。github
咱們去使用一個開源庫,可能咱們只須要當中的某一塊功能,有一部分的功能其實咱們是不須要的,可是由於某一個功能而去集成一個庫,總感受怪怪的。數組
使用一個開源庫,那麼對於這個庫的的依賴性就比較強,若是做者中止維護,後期新增的需求該框架知足不了,若是引入的是源碼,那還能夠修改做者的源碼,可是前期是得很是瞭解該框架的總體設計,邏輯等等。bash
我的認爲以上兩點其實都不是最重要的,我以爲最重要的是能夠去學習這些優秀框架的設計思想,代碼的健壯性,各類騷操做等等,能夠增加本身的知識面,能夠從中學習成長很多。app
整個框架的入口爲PictureSelector,使用方法以下:框架
//圖片選擇所有功能
PictureSelector.with(this)
.selectSpec() //圖片選擇屬性配置
.setImageLoader(new GlideImageLoader()) //圖片加載方案,默認提供了GlideImageLoader
.setSpanCount(3) //圖片一行顯示幾張圖片
.setOpenCamera() //開啓系統拍照功能
.needCrop() //是不是否須要剪裁
.setOutputX(200) //設置圖片剪裁的大小
.setOutputY(200) //設置圖片剪裁的大小
.setAuthority("org.lym.picture.selector.fileprovider") //適配Android7.0系統拍照
.setMaxSelectImage(single ? 1 : 9) //設置圖片多選
.startForResult(IMAGES_CODE); //開啓圖片選擇
//單選圖片
PictureSelector
.with(this)
.selectSpec()
.startForResult(IMAGES_CODE);
//單選圖片並開啓剪裁併設置圖片剪裁的大小
PictureSelector
.with(this)
.selectSpec()
.needCrop()
.setOutputX(200)
.setOutputY(200)
.startForResult(IMAGES_CODE);
//單選圖片並開啓相冊拍照
PictureSelector
.with(this)
.selectSpec()
.setOpenCamera()
//開啓拍照功能必定得設置該屬性,爲了兼容Android7.0相機拍照問題
//在manifest文件中也須要註冊該provider
.setAuthority("org.lym.picture.selector.fileprovider")
.startForResult(IMAGES_CODE);
//圖片多選
PictureSelector.with(this)
.selectSpec()
.setOpenCamera()
.setMaxSelectImage(3)
.startForResult(IMAGES_CODE);
複製代碼
<!-- 兼容android7.0 需配置xml文件路徑,可將該框架中的xml拷貝至你的項目下配置便可 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/external_path"/>
</provider>
複製代碼
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == IMAGES_CODE && resultCode == Activity.RESULT_OK) {
if (null != data) {
//圖片單選和多選數據都是以ArrayList的字符串數組返回的。
List<String> paths = PictureSelector.obtainPathResult(data);
mResultAdapter.setNewData(paths);
}
}
}
複製代碼
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
複製代碼
<!-- 兼容android7.0 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/external_path"/>
</provider>
複製代碼
建議你們以源碼的形式導入到你的項目中,這樣你能夠只提取你須要的功能,剔除對你無用的功能,也方便你的擴展,固然,你也能夠在GitHub上提issues,(提了我也不改),哈哈,開個玩笑,只要提了我都會盡我能力去解決的,歡迎你們start,fork。ide