效果图
正文
今天我们来学习下如何集成知乎的图片选择器Matisse
下面我们就来看看如何在我们的项目中使用Matisse
配置Gradle
首先我们要对Gradle进行配置
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下导入Matisse,使用:implementation 'com.zhihu.android:matisse:0.5.1'
开始使用
我们可以在我们的项目的任何地方使用,但是你要注意一些问题,比如生命周期,非主线程不能进行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补上Glide4Engine(其实这个就在Matisse的GitHub,我这里复制下来,你可以自己去官网了解更多)
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的使用非常简单,只需要配置一些选项就可以了,那么我们从Matisse选择器上选择到的视频或者图片是在哪里获取呢,我们注意到Matisse中有一个选项是forResult(0),是不是和startActivityForResult()有点类似啊,所以我获取的视频和图片是在Activity的onActivityResult回调方法里得到的
@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里面
看到这里,可以能有的朋友已经在开始尝试运行了,但是要注意了,这里我们还忘记写了一个东西,那就是权限,我们在AndroidMainfest.xml中加入权限
<!-- 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" />
还要注意的一点是,如果你是运行在6.0及以上的Android系统的话,那么要动态的去申请权限,因为读写手机内存和开启摄像头都是危险权限,我们需要手动去申请
好了,今天的内容就到这里。