圖片選擇器:PictureSelector

前言

輕量級圖片選擇框架,多選,拍照,支持剪裁,自定義圖片加載

圖片選擇框架其實已有許多優秀成熟的框架,比如知乎開源的 Matisse,遵循Google提倡的MaterialDesign ,感興趣的朋友可以查看看下這篇文章,對Matisse的使用有一個粗略的認識。


簡述

既然已經有了這么優化的框架為啥還要重復造輪子呢,估計很多讀者都有這樣的疑問,對于這個問題我想說以下幾點。

  • 我們去使用一個開源庫,可能我們只需要當中的某一塊功能,有一部分的功能其實我們是不需要的,但是因為某一個功能而去集成一個庫,總感覺怪怪的。

  • 使用一個開源庫,那么對于這個庫的的依賴性就比較強,如果作者停止維護,后期新增的需求該框架滿足不了,如果引入的是源碼,那還可以修改作者的源碼,但是前期是得非常了解該框架的整體設計,邏輯等等。

  • 個人認為以上兩點其實都不是最重要的,我覺得最重要的是可以去學習這些優秀框架的設計思想,代碼的健壯性,各種騷操作等等,可以增長自己的知識面,可以從中學習成長不少。


一、功能介紹

  • 支持圖片多選,直接拍照,圖片剪裁,直接自定義圖片加載。

二、使用介紹

整個框架的入口為PictureSelector,使用方法如下:

  1. 圖片選擇屬性配置
            //圖片選擇全部功能
            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);

  1. 兼容Android7.0系統拍照FileProvider配置
        <!-- 兼容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>
  1. 接收圖片選擇后的結果
      @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);
            }
        }
    }

三、注意事項

  • 使用該框架需要訪問sdcard路徑,那么你需要在你的manifest注冊以下兩個權限,如果在Android6.0之后使用的話,那么則需要動態申請一下權限,關于動態權限申請可以使用AndPermission,這里就不贅述了。
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 如果你需要使用拍照功能的話,那么一定得在manifest中聲明一個FileProvider并配置name屬性的路徑,然后需要setAuthority該屬性。
      <!-- 兼容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>
  • 圖片加載策略,框架默認提供的是Glide,Glide版本為當前最新版本4.8.0,Glide在V4之后Api有所改變,詳情請訪問Glide官方文檔,如果你的項目使用的不是Glide那么,也沒關系,你只需要實現UIImageLoader然后通過setImageLoader設置即可。
結語

建議大家以源碼的形式導入到你的項目中,這樣你可以只提取你需要的功能,剔除對你無用的功能,也方便你的擴展,當然,你也可以在GitHub上提issues,(提了我也不改),哈哈,開個玩笑,只要提了我都會盡我能力去解決的,歡迎大家start,fork。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容