Android 知乎圖片選擇器 Matisse

效果圖
圖片發(fā)自簡書App

正文

今天我們來學(xué)習(xí)下如何集成知乎的圖片選擇器Matisse
下面我們就來看看如何在我們的項(xiàng)目中使用Matisse

配置Gradle

首先我們要對Gradle進(jìn)行配置

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    
    implementation 'com.zhihu.android:matisse:0.5.1'//知乎圖片選擇器
}

在dependencies下導(dǎo)入Matisse,使用:implementation 'com.zhihu.android:matisse:0.5.1'

開始使用

我們可以在我們的項(xiàng)目的任何地方使用,但是你要注意一些問題,比如生命周期,非主線程不能進(jìn)行UI操作等

/**
 * 打開知乎圖片選擇器
 */
private void startMatisse() {
    Matisse.from(RegisterActivity.this)
            .choose(MimeType.ofImage())
            .countable(true)
            .maxSelectable(1)
            .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)
            .thumbnailScale(0.85f)
            .theme(R.style.Matisse_Zhihu)
            .imageEngine(new Glide4Engine())
            .forResult(0);
}

2019.3.23補(bǔ)上Glide4Engine(其實(shí)這個就在Matisse的GitHub,我這里復(fù)制下來,你可以自己去官網(wǎng)了解更多)

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.bumptech.glide.request.RequestOptions;
import com.zhihu.matisse.engine.ImageEngine;

/**
 * {@link ImageEngine} implementation using Glide.
 */

public class Glide4Engine 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)
                .apply(new RequestOptions()
                        .override(resize, resize)
                        .placeholder(placeholder)
                        .centerCrop())
                .into(imageView);
    }

    @Override
    public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
                                 Uri uri) {
        Glide.with(context)
                .asBitmap() // some .jpeg files are actually gif
                .load(uri)
                .apply(new RequestOptions()
                        .override(resize, resize)
                        .placeholder(placeholder)
                        .centerCrop())
                .into(imageView);
    }

    @Override
    public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        Glide.with(context)
                .load(uri)
                .apply(new RequestOptions()
                        .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)
                .apply(new RequestOptions()
                        .override(resizeX, resizeY)
                        .priority(Priority.HIGH)
                        .fitCenter())
                .into(imageView);
    }

    @Override
    public boolean supportAnimatedGif() {
        return true;
    }

}

我們可以看到Matisse的使用非常簡單,只需要配置一些選項(xiàng)就可以了,那么我們從Matisse選擇器上選擇到的視頻或者圖片是在哪里獲取呢,我們注意到Matisse中有一個選項(xiàng)是forResult(0),是不是和startActivityForResult()有點(diǎn)類似啊,所以我獲取的視頻和圖片是在Activity的onActivityResult回調(diào)方法里得到的

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case 0:
                Matisse.obtainPathResult(data);
                break;
            default:
                break;
        }
    }
}

視頻和圖片的本地地址就在data里面

看到這里,可以能有的朋友已經(jīng)在開始嘗試運(yùn)行了,但是要注意了,這里我們還忘記寫了一個東西,那就是權(quán)限,我們在AndroidMainfest.xml中加入權(quán)限

<!-- sd卡存儲 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 攝像頭 -->
<uses-permission android:name="android.permission.CAMERA" />

還要注意的一點(diǎn)是,如果你是運(yùn)行在6.0及以上的Android系統(tǒng)的話,那么要動態(tài)的去申請權(quán)限,因?yàn)樽x寫手機(jī)內(nèi)存和開啟攝像頭都是危險(xiǎn)權(quán)限,我們需要手動去申請

好了,今天的內(nèi)容就到這里。

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

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

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