Android開源:Matisse-圖片選擇器
很多 App 都有選取圖片的需求,例如在 IM 中發送圖片,在內容編輯的時候插入圖片。Android 系統中的組件可以幫助我們大大減少開發負擔,我們可以通過
Intent toGallery = new Intent(Intent.ACTION_GET_CONTENT); toGallery.setType("image/*"); toGallery.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(toGallery, REQUEST_GALLERY);
打開系統中支持文件選擇的 Activity 選擇圖片。但是如果我們想要更符合業務場景的界面和交互,同時保證不同移動平臺上的體驗一致,上面這種做法就不能滿足需求了。于是我們選擇實現自己的圖片選擇器 Matisse。
讓我們先來看看 Matisse 圖片選擇器是什么樣子:
知乎 App 是支持日夜間模式的,因此 Matisse 也需要具備這個功能。但是作為一個開源庫,不能依賴主 App 的日夜間模式的實現,我們為 Matisse 內置了兩套主題,藍色的 Zhihu 主題和暗色的 Dracula 主題。它們是通過先定義一套自定義屬性,再在此基礎上各自定義一個 theme,在創建圖片選擇器 Activity 的時候,應用這個 theme。如果兩套內置主題不能滿足你的需求,你也可以定義自己的 theme。
Matisse 的調用非常簡單,使用了 Builder 模式,只需要在調用的時候傳入想要的參數,后續的事情就不用你操心了。一個調用的例子如下:
Matisse .from(MainActivity.this) .choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF)) .countable(true) .maxSelectable(9) .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)) .gridExpectedSize(getResources() .getDimensionPixelSize(R.dimen.grid_expected_size)) .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) .thumbnailScale(0.85f) .imageEngine(new GlideEngine()) .forResult(REQUEST_CODE_CHOOSE);
通過上面的調用示例,你應該也可以猜到我們的接口大致有哪些功能:
-
支持包括 JPEG, PNG, GIF 圖片類型的選擇。后面可能還會支持視頻內容的選擇;
-
支持有序選擇圖片,也即選擇圖片的時候會有 1, 2, 3, 4… 樣式的 CheckBox;
-
支持指定最大可選數量;
-
支持定義篩選規則,你可以針對特定圖片類型集合,制定完全自定義的篩選規則;
-
可以定義圖片縮略圖的縮放比例。縮放比例越大,縮略圖越清晰,但是列表滑動的時候,縮略圖的加載也相應比較慢;
-
支持橫豎屏。Matisse 做了狀態保存的工作,因此不需要擔心應用 configuration 變化帶來的困擾,包括橫豎屏的轉換;
- 支持不同的圖片加載庫,目前支持 Glide 和 Picasso。如果 Glide 和 Picasso 都不是你需要的,可以通過實現一個圖片加載接口,定義自己的圖片加載引擎。很抱歉,我們暫時不支持 Fresco。
在數據加載方面,我們使用 Loader 作為相冊和相冊圖片數據的加載機制,它可以很方便地異步獲取系統 MediaStore 中的圖片數據,只需定義好回調接口,數據就會自動返回到 UI 線程上。同時,在應用 configuration 改變的時候,頁面可以重新連接上之前的 Loader,無需重新查詢數據。如果你沒用過 Loader,可以回憶一下 AsyncTask,它們用起來的感覺差不多,只不過 Loader 是一個更加強大的異步加載框架。
我們并沒有采用 MV* 這些幫助代碼實現分層解耦的架構,也盡量避免加入過多的第三方庫的依賴。獲取圖片數據并進行展示是一件略繁瑣的事情,因此這個庫的代碼并不是十分優雅。但是 Matisse 為你屏蔽了這些繁瑣的邏輯和界面展示的細節,你要做的只是添加依賴,并通過幾行代碼進行調用即可。
Matisse 簡單易用,可以滿足你對于圖片選擇的基本需求。我們已經在知乎 Android App 內使用了 Matisse,也在 GitHub 上開源了它,感興趣的同學可以看一下源碼 zhihu/Matisse ,想吐槽或者提 bug 的可以提 issue,覺得有寫的不好的地方,或希望添加新功能,也歡迎提 PR。
項目主頁:http://www.baiduhome.net/lib/view/home/1492654172074