圖片選擇器:PictureSelector

前言

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

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


簡述

既然已經有了這麼優化的框架爲啥還要重複造輪子呢,估計不少讀者都有這樣的疑問,對於這個問題我想說如下幾點。github

  • 咱們去使用一個開源庫,可能咱們只須要當中的某一塊功能,有一部分的功能其實咱們是不須要的,可是由於某一個功能而去集成一個庫,總感受怪怪的。數組

  • 使用一個開源庫,那麼對於這個庫的的依賴性就比較強,若是做者中止維護,後期新增的需求該框架知足不了,若是引入的是源碼,那還能夠修改做者的源碼,可是前期是得很是瞭解該框架的總體設計,邏輯等等。bash

  • 我的認爲以上兩點其實都不是最重要的,我以爲最重要的是能夠去學習這些優秀框架的設計思想,代碼的健壯性,各類騷操做等等,能夠增加本身的知識面,能夠從中學習成長很多。app


1、功能介紹

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

2、使用介紹

整個框架的入口爲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);
            }
        }
    }
複製代碼

3、注意事項

  • 使用該框架須要訪問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。ide

相關文章
相關標籤/搜索