Android開發之高仿微信圖片選擇器
記得剛開始做Andriod專案那會,經常會碰到一些上傳圖片的功能需求,特別是社交類的app,比如使用者頭像,說說配圖,商品配圖等功能都需要讓我們到系統相簿去選取圖片,但官方卻沒有提供可以選取多張圖片的相關API,所以那時候會到Github上去找找相關的開源庫,也覺得挺方便的,但隨著後來Android系統的更新,帶來了很多新特性和API的改變,比如從Android6.0後的動態許可權申請,7.0的私有目錄許可權以及一些API的廢棄(Uri.fromFile等),但所用的開源庫作者又沒有很及時的去更新適配,又或者一些開源庫直接在庫中引入了圖片載入框架,導致專案中存在多個圖片載入框架,這樣就造成了包體積的增大和方法數的增加,導致專案中或多或少會出現一些問題,所以那時萌生了想自己寫一個圖片選擇器,儘可能的做到簡潔,速度快,然後一個圖片選擇器的庫就這麼誕生了: ofollow,noindex">ImagePicker圖片載入器
實現效果圖:

效果圖1

效果圖2

效果圖3
使用方式:
1、在專案下的build.gradle檔案中引入(注意gradle的版本):
//gradle版本在3.0以下引入此行 compile 'com.lcw.library:imagepicker:1.0.1' //gradle版本在3.0以上引入此行 implementation 'com.lcw.library:imagepicker:1.0.1'
2、然後需要在AndroidManifest.xml裡宣告元件:
<application> .... <!--圖片選擇器的主Activity--> <activity android:name="com.lcw.library.imagepicker.activity.ImagePickerActivity" android:screenOrientation="portrait" /> ... </application>
3、呼叫方式非常簡單,只需要簡單一行程式碼:
ImagePicker.getInstance() .setTitle("標題")//設定標題 .showCamera(true)//設定是否顯示拍照按鈕 .setMaxCount(9)//設定最大選擇圖片數目(預設為1,單選) .setImageLoader(new GlideLoader())//設定自定義圖片載入器 .start(mContext, REQUEST_SELECT_IMAGES_CODE);//REQEST_SELECT_IMAGES_CODE為Intent呼叫的requestCode
4、獲取選擇圖片返回的資料:
@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); } }
5、關於自定義圖片載入器,不具體指定圖片載入框架,讓開發者更加靈活的定製,只需要去實現ImageLoader介面即可:
public class GlideLoader implements ImageLoader { @Override public void loadImage(ImageView imageView, String imagePah) { //小圖載入,這裡以Glide圖片載入框架為例 RequestOptions options = new RequestOptions() .centerCrop() .placeholder(R.mipmap.icon_image_default) .error(R.mipmap.icon_image_error); Glide.with(imageView.getContext()).load(imagePah).apply(options).into(imageView); } }
6、關於許可權,6.0以後危險許可權需要動態申請,不瞭解的同學可以看下我之前寫過的一篇文章 《適配Android6.0動態許可權管理》 ,由於國內各大廠商的ROM存在差異化,需要經常處理一些相容上的問題,也有比較成熟的開源庫,為了簡潔,本Library就不提供此功能,請開發者自行處理,所需許可權:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" />
7、最後需要注意的是在Android7.0後私有目錄被限制訪問,這裡做了相容處理,在開啟拍照按鈕的時候需要注意:
(1)首先需要在AndroidManifest.xml裡宣告元件:
<application> .... <!-- Android 7.0 檔案共享配置 --> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.lcw.library.imagepicker.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/image_picker" /> </provider> .... </application>
(2)然後在res資料夾下建立一個xml資料夾,放置xml檔案(image_picker.xml)即可,xml內容如下:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="imagePicker" path="" /> </paths>
8、其他:
根據業務的需求,有時候我們在選擇一部分圖片後,再次跳轉圖片選擇器的時候,想要去儲存已經勾選的圖片狀態,這邊也提供了對應的方法,只需要把onActivityResult返回的圖片路徑List集合,重新設定進來即可,程式碼如下:
ImagePicker.getInstance() .setTitle("標題") .showCamera(true) .setMaxCount(9) .setImagePaths(mImagePaths)//設定list .setImageLoader(new GlideLoader()) .start(MainActivity.this, REQUEST_SELECT_IMAGES_CODE);
寫在最後:
這個庫會持續維護下去,會遵循極簡的原則,把庫做的儘可能的小,歡迎大家提建議,更加具體的使用請參考下面原始碼中的Demo演示~
原始碼下載:
這裡附上原始碼地址(歡迎Star,歡迎Fork): ImagePicker