Matisse, 看看源码

简介

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

  • 在Activity和Fragment中使用
  • 支持JPEG,PNG,GIF的图片选择和MPEG,MP4格式的视频选择。不能同时选择图片和视频
  • 两种主题可供选择,因为知乎也是两种主题
  • 图片Loader
  • 自定义过滤条件

使用方法

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
《Matisse, 看看源码》《Matisse, 看看源码》《Matisse, 看看源码》

源码分析

代码结构

《Matisse, 看看源码》

类分析

类名描述
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比较

  • 从MatisseActivity来看的话,大致的设计思路和PhotoPicker相似,都是以单独的Activity为载体,传递参数的方式和PhotoPicker不同,PhotoPicker使用的是bundle, 而Matisse使用的是SelectionSpec单例,启动应用之前,参数全部设置完毕,然后在MatisseActivity通过SelectionSpec.getInstance()拿到单例,获取参数。选择结果和PhotoPicke实现比较相似,都是通过Bundle保存结果通过setResult返回给调用的Activity或者Fragment.
    SelectedPreviewActivity就是PhotoPicker中的预览Activity,只是没有通过SelectionSpecBuilder对外暴露,要使用的话,我们只能自己显式的调用。

  • 与PhotoPicker一样,都是采用Android Loader机制作为数据加载的方式,大致原理清楚,自己在平时的开发中还没有用到过,找个机会尝试一下。

  • Build设计模式,链式代码编写方式。

  • PhotoPicker使用的是Glide作为图片加载框架,而Matisse支持Glide和Picasso,但是Picasso支持的功能Glide全都有,选择一个即可(Picasso不支持Gif)

  • Matisse,支持视频文件的选择,PhotoPicker从名字上看就不支持。

  • PhotoPicker支持自定义样式,主要是颜色;Matisse,支持两种主题模式,与知乎呼应。

备注

个人微信公众号:Learning_Of_ALL,欢迎大家扫码关注,Android技术交流。

《Matisse, 看看源码》

    原文作者:Android源码分析
    原文地址: https://juejin.im/entry/590bc615ac502e006cdb664f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞