本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出
前言
在實際開發中,圖片選擇器一直都是必不可少的一個部分,不管是 QQ 頭像的設定,還是傳送一條裝逼的微信朋友圈,都要用到圖片選擇器來給使用者選擇他們想要上傳的圖片,最近知乎開源了一款圖片選擇庫 Matisse 簡直美哭了,而且完全遵循 Android 互動設計規範,實在是很良心。有需要的 點選這裡
在開始正文之前,先欣賞一下這個圖片選擇器的效果
是不是感覺相當的簡潔好看,反正我是這麼認為的。
一、基本使用
1、匯入相應的依賴庫
Gradle:
repositories {
jcenter()
}
dependencies {
compile 'com.zhihu.android:matisse:0.4.3'
}複製程式碼
有一點要注意一下, 這個圖片選擇庫是使用 Glide 或 Picasso 作為圖片載入引擎
如果你使用 Glide 作為你的圖片載入引擎,請新增 Glide 的 README 上所說的規則,以及新增額外的規則:
-dontwarn com.squareup.picasso.**複製程式碼
如果你使用 Picasso 作為你的圖片載入引擎,請新增 Picasso 的 README 上所說的規則,以及新增額外的規則:
-dontwarn com.bumptech.glide.**複製程式碼
2、啟動 Matisse
在正式寫程式碼之前,有兩個相關的許可權需要先申請:
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE複製程式碼
所以,如果你的 APP 是跑在 Android 6.0+ 的話,你需要在下個步驟之前處理一下執行時許可權。
我們可以在平常的 Activity 或 Fragment 中啟動 MatisseActivity
Matisse.from(MainActivity.this)
.choose(MimeType.ofAll(), false) // 選擇 mime 的型別
.countable(true)
.maxSelectable(9) // 圖片選擇的最多數量
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
.thumbnailScale(0.85f) // 縮圖的比例
.imageEngine(new GlideEngine()) // 使用的圖片載入引擎
.forResult(REQUEST_CODE_CHOOSE); // 設定作為標記的請求碼複製程式碼
3、接收選擇的結果
在啟動圖片選擇器的 Activity 或 Fragment 中的 onActivityResult() 進行結果的回撥處理
List<Uri> mSelected;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {
mSelected = Matisse.obtainResult(data);
Log.d("Matisse", "mSelected: " + mSelected);
}
}複製程式碼
二、常用的 API
Mime 型別
Matisse 支援以下的 mime 型別
Mime type | File extensions | Media type |
---|---|---|
image/jpeg | jpg, jpeg | image |
image/png | png | image |
image/gif | gif | image |
imagex-ms-bmp | bmp | image |
video/mpeg | mpeg, mpg | video |
video/mp4 | mp4, m4v | video |
video/quicktime | mov | video |
video/3gpp | 3gp, 3gpp | video |
video/3gpp2 | 3g2, 3gpp2 | video |
video/x-matroska | mkv | video |
video/webm | webm | video |
video/mp2ts | ts | video |
video/avi | avi | video |
預設情況下,所有的影像和視訊都將顯示在 Matisse 中,你不能通過以下方法來限制可選擇的 mime 型別:
- MimeType.ofAll()
- MimeType.of(MimeType type, MimeType... rest)
- MimeType.ofImage()
- MimeType.ofVideo()
buguo你可以讓 Matisse 只顯示一種媒體型別,如果
- 啟動的時候,呼叫
showSingleMediaType(true)
- 只選擇圖片或者視訊
數量
預設情況
在縮圖的右上角有一個複選標記,讓你不僅可以選擇一個影像
自動增長的數目
使用 countable(true)
來顯示一個從 1 開始的數字
最大的數字數量
使用 maxSelectable(int maxSelectable)
來限制可選擇的最大數目
方向
使用 restrictOrientation*(@ScreenOrientation int orientation)
來設定影像選擇和預覽活動所需的方向。
網格的規格
如果你想要固定的跨度計數,請使用 spanCount(int spanCount)
,當方向更改時,範圍計數將保持不變。
如果希望可以靈活地適應不同螢幕的網格大小,請使用 spanCount(int spanCount)
,該值不一定被應用,因為圖片網格應該填滿檢視容器。測量的圖片網格的大小將盡可能接近該值。
縮圖縮放
使用 thumnailScale(float scale)
來設定縮圖點陣圖相對於檢視大小的縮放比例,而且它應該是(0.0,1.0)中的浮點值。
三、主題
內建的主題
在 Matisse 中有兩種內建的主題:
- Zhihu(亮藍色主題)
- Dracula(黑色主題)
當啟動 Matisse 的時候,呼叫 theme(@styleRes int themeId) 方法來使用其中一種主題
Matisse.from(MainActivity.this)
...
.theme(R.style.Matisse_Zhihu | R.style.Matisse_Dracula)
.forResult(REQUEST_CODE_CHOOSE);複製程式碼
自定義主題
從兩個內建主題,甚至是他們的父母派生自定義主題,你可以自定義 Matisse 的外觀
這些屬性(在 attrs.xml 中定義)可以修改:
屬性 | 作用 |
---|---|
colorPrimary | 應用欄的顏色 |
colorPrimaryDark | 狀態列的較暗變體 |
toolbar: toolbar | toolbar 的風格 |
album.dropdown.title.color | 專輯名稱下的專輯中的下拉選單中的顏色 |
album.dropdown.count.color | 工具欄元素的顏色,元素包括導航圖示,所選的相簿標題和右側的下拉箭頭圖示 |
album.thumbnail.placeholder | 相簿縮圖的佔位符 |
album.emptyView | 繪製圖片的空檢視 |
album.emptyView.textColor | 空白檢視的文字顏色 |
item.placeholder | 媒體網格的佔位符顏色或 drawable |
page.bg | Activity 或 Fragment 頁面的背景顏色或 drawable |
bottomToolbar.preview.textColor | 底部工具欄的背景顏色或 drawable |
bottomToolbar.apply.textColor | 預覽按鈕文字的底部工具欄上的顏色 |
listPopupWindwoStyle | 專輯列表的下拉選單樣式 |
capture.textColor | 可能出現在頂部的捕獲網格的文字顏色 |
以上便是本文的全部內容,如果覺得寫得還可以的話,希望來一波關注和喜歡。