Matisse第三方圖片選擇庫(kù)的使用

1.可用的參考文章:

2.需求

  • 我的需求是非常簡(jiǎn)單,就是要把圖片選擇然后返回圖片的真實(shí)路徑。
    • 需求1:選擇多圖
    • 需求2:返回Uri
    • 需求3:獲取圖片真實(shí)路徑

3.第三方庫(kù) Matisse

相識(shí)的圖片選擇庫(kù)有很多,比如:PhotoPicker。至于我選擇Matisse的原因是之前學(xué)習(xí)中就有使用過這個(gè)庫(kù),用起來有快捷。

4.使用步驟

  • 1.導(dǎo)入相應(yīng)的依賴庫(kù)。
  • 2.權(quán)限申請(qǐng)(臨時(shí)動(dòng)態(tài)權(quán)限)。
  • 3.啟動(dòng)Matisse。
  • 4.重寫GlideEngine類,在Matisse中引用。
  • 5.接收選擇的結(jié)果onActivityResult。
  • 6.返回的Uri轉(zhuǎn)換成真實(shí)路徑。

5.遇到的問題

  • 問題1:Matisse的圖片加載器GlideEngine需要重寫。
  • 問題2:Fragment的onActivityResult方法不會(huì)調(diào)用,需要在Activity中重寫。

問題1:Matisse的圖片加載器有兩種:Glide和Picasso,發(fā)現(xiàn)GlideEngine類的寫法還停留在3.7版本之前,這時(shí)我就打開了Matisse的Github上的問題庫(kù)和案例。

GlideEngine錯(cuò)誤
  • 問題1解決辦法:就是手動(dòng)寫一個(gè)GlideEngine類,并在Matisse啟動(dòng)方法中去調(diào)用這個(gè)類。
調(diào)用另一個(gè)GlideEngine
新版Glide的寫法

問題2:原本的是在Fragment中去啟動(dòng)Matisse進(jìn)行圖片選擇,但是在返回onActivityResult中的代碼遲遲未調(diào)用,導(dǎo)致我頭昏腦脹。

  • 問題2解決方法:在Fragment所在的Activity中重寫onActivityResult()方法并接收返回的圖片Uri,最后把數(shù)據(jù)傳遞給Fragment(這里就考到Activity與Fragment之間的通信問題)。

6.代碼

1.導(dǎo)入相應(yīng)的依賴庫(kù)

    //圖片選擇庫(kù)
    implementation 'com.zhihu.android:matisse:0.5.2-beta4'
   //圖片加載
    implementation 'com.github.bumptech.glide:glide:4.9.0'

2.權(quán)限申請(qǐng)(臨時(shí)動(dòng)態(tài)權(quán)限)

android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE

權(quán)限申請(qǐng)的工具類可以參考這個(gè)文章:http://www.itdecent.cn/p/5e566e05dd96

3.啟動(dòng)Matisse

/**
 * 知乎開源圖片選擇器
 */
private void ChooserImg() {
    Matisse.from(getActivity())
            .choose(MimeType.ofAll(), false)
            .countable(true)
            .maxSelectable(9) // 圖片選擇的最多數(shù)量
            .gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
            .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .thumbnailScale(0.85f) // 縮略圖的比例
            .imageEngine(new GlideImageEngine()) // 使用的圖片加載引擎
            .forResult(REQUEST_CODE_CHOOSE); // 設(shè)置作為標(biāo)記的請(qǐng)求碼
}

還要在dimens.xml中添加以下代碼:

    <dimen name="grid_expected_size">120dp</dimen>
    <dimen name="item_margin_horizontal">24dp</dimen>
    <dimen name="item_margin_vertical">8dp</dimen>

為了你們的方便,我把標(biāo)識(shí)碼代碼也貼出來

    // 圖庫(kù)選取圖片標(biāo)識(shí)請(qǐng)求碼
    private static final int REQUEST_CODE_CHOOSE = 0x13;
  • 4.重寫GlideEngine類,在Matisse中引用。

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.Priority;
import com.zhihu.matisse.engine.ImageEngine;

/**
 * Created by songsong on 2019/5/4 0004
 */
public class GlideImageEngine implements ImageEngine {
    @Override
    public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
        Glide.with(context)
                .asBitmap()  // some .jpeg files are actually gif
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);
    }
    @Override
    public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
        Glide.with(context)
                .asBitmap()
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);

    }
    @Override
    public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        Glide.with(context)
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .fitCenter()
                .into(imageView);
    }
    @Override
    public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        Glide.with(context)
                .asGif()
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .into(imageView);
    }
    @Override
    public boolean supportAnimatedGif() {
        return true;
    }
}

5.接收選擇的結(jié)果onActivityResult,返回的Uri轉(zhuǎn)換成真實(shí)路徑。

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     if (resultCode == RESULT_OK) {// 操作成功了
         switch (requestCode) {
             case REQUEST_CODE_CHOOSE:// 圖庫(kù)選擇圖片
                 List<Uri> imglisturi = Matisse.obtainResult(data);
                 List<String> imgliststr = new ArrayList<>();
                 for (Uri uri : imglisturi) {
                     imgliststr.add(ImageUriUtil.getPhotoPathFromContentUri(this, uri));
                 }
                 LogUtil.Logd("onActivityResult拿到了" + imgliststr.size() + "張圖片:" + imgliststr);
                 break;
         }
     }
 }

End

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容