Matisse, 来自知乎的PhotoPicker

/ Android开源库 / 没有评论 / 230浏览

简介

Matisse,是一款由知乎开源的媒体选择器。


使用方法

Gradle

repositories {
    jcenter()
}

dependencies {
    compile 'com.zhihu.android:matisse:0.4.3'
}

ProGuard

如果使用Glide作为图片加载开源库

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}

# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule

如果使用Picasso作为图片加载开源库

-dontwarn com.squareup.okhttp.**

代码使用

知乎主题

Matisse.from(MainActivity.this)
        .choose(MimeType.ofAll())
        .countable(true)
        .maxSelectable(9)
        .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
        .gridExpectedSize(
                getResources().getDimensionPixelSize(R.dimen.grid_expected_size))
        .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
        .thumbnailScale(0.85f)
        .imageEngine(new GlideEngine())
        .forResult(REQUEST_CODE_CHOOSE);

Dracula主题

Matisse.from(MainActivity.this)
        .choose(MimeType.of(MimeType.JPEG, MimeType.PNG))
        .theme(R.style.Matisse_Dracula)
        .countable(false)
        .maxSelectable(9)
        .imageEngine(new PicassoEngine())
        .forResult(REQUEST_CODE_CHOOSE);

结果处理

List<Uri> mSelected;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_CHOOSE && resultCode == RESULT_OK) {
        mSelected = Matisse.obtainResult(data);
        Log.d("Matisse", "mSelected: " + mSelected);
    }
}

更多详细内容请查阅官方Wiki.


效果

图片来源项目Github

Zhihu StyleDracula StylePreview

源码分析

代码结构

这里写图片描述

类分析

类名描述
ImageEngine图片加载接口,方便后面根据Glide和Picasso分别实现
GlideEngineGlide实现ImageEngine
PicassoEnginePicasso实现ImageEngine
Filter过滤条件抽象类,我们可以通过集成Filter实现对应的过滤条件来对图片进行筛选,可以添加多个Filter,具体参考官方Demo中的GifSizeFilter
Album相册Entity
CaptureStrategy拍照相关,媒体处理authority
IncapableCause信息处理,toast和dialog
Item选择媒体界面的Item
SelectionSpec选择参数类
AlbumLoader相册CursorLoader
AlbumMediaLoader图片和视频CursorLoader
AlbumCollectionAlbumLoader回调
AlbumMediaCollectionAlbumMediaLoader回调
SelectedItemCollection被选中项集合
internal/ui包界面显示的Adapter,自定义视图,Fragment和Activity
internal/utils包工具类
MatisseActivity关键类,执行选择媒体操作的时候展示出来的Activity
Matisse开源库的入口和出口,用来传递Activity和Fragment,创建SelectionSpecBuilder和返回结果
MimeType媒体类型
SelectionSpecBuilderBuild构造类,用来传递参数

设计思路

与PhotoPicker比较