简介

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 Style Dracula Style Preview

源码分析

代码结构

类分析

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

设计思路

与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,来自知乎的PhotoPicker的更多相关文章

  1. java提升路线书单(原文自知乎刘欣)

    复制黏贴自知乎刘欣大神,作为个人的书单与指导路线 原文链接:https://www.zhihu.com/question/19848946/answer/92536822   刘欣 追寻内心的真正兴趣 ...

  2. Android带多选功能的PhotoPicker

    最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一 ...

  3. Android高仿微信图片选择功能的PhotoPicker

    类似于微信修改头像的功能基本上每个app都会有,以前公司开发的项目就有修改头像的功能,但是用的Android系统自带的图片选择器.用Android系统的图片选择器有个好处就是稳定,不会有什么问题.但也 ...

  4. CSS层叠样式表的层叠是什么意思(转自知乎)

    转自知乎上的回答:http://www.zhihu.com/question/20077745 解答一: 层叠指的是样式的优先级,当产生冲突时以优先级高的为准.1. 开发者样式>读者样式> ...

  5. 使用MyEclipse Swing/Matisse

     经常使用JBuilder开发工具的人都知道,在JBuilder中开发Swing应用程序是比较方便的,虽然比不上曾经红遍一时的Visual Basic,但开发界面的工作确实被大大简化了.     JB ...

  6. IOS学习经验总结--来自知乎网友

    转自知乎:http://www.zhihu.com/question/20016551 我当时刚学iOS开发的时候一样的感觉 总想知道原理 内部怎么回事 感觉在像在雾里但是iOS开发就是这样 他是封闭 ...

  7. <Android 开源库> PhotoPicker 从头到脚

    1. 简介 PhotoPicker, 是一款开源的图片选择器.效果上和微信相似. 2. 使用方法 2.1 添加依赖 dependencies { compile 'me.iwf.photopicker ...

  8. 你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT

    你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT 一.总结 一句话总结:看了大概200条评论,99%的不后悔,大部分人后悔没有早点干,但是做it最最主要的是要注意身体. 1.it是最 ...

  9. PhotoPicker 从头到脚

    1. 简介 PhotoPicker, 是一款开源的图片选择器.效果上和微信相似. 2. 使用方法 2.1 添加依赖 dependencies { compile 'me.iwf.photopicker ...

随机推荐

  1. JavaScript与Java数据类型的区别

    今天开始正式认真学习js,虽然在平常j2ee开发中也经常用到JS但并不精通,这次随笔记下js与Java数据类型的不同之处 Number 与java不同,js作为弱类型语言即使在浮点数与整数上也未作明确 ...

  2. Nested DollsHDU1677

    /*题意:有n个矩形,用长和宽表示,如果一个的长和宽都比另一个小,那么这个嵌放在另一个中 所以先对w从大到小排序,w一样的按h从小到大排序,那么就从后面的箱子往前找,只要前面找到一个人h比自己大的就放 ...

  3. jQuery图片垂直滚动焦点图

    在线演示 本地下载

  4. openstack认证实践

    环境: 客户端:负责发送请求, 服务器:负责接受请求: 认证服务器keystone:负责认证 具体认证步骤: 1.客户端首先进行签名计算,将得到的签名字符串作为authorization发给keyst ...

  5. C++命名(自定义)

    1.自定义函数 void GetName(): 2.布尔型变量 BOOL ISOPEN:

  6. [CF489D]Unbearable Controversy of Being

    题目大意:求有向图中这种图的数量 从分层图来考虑,这是一个层数为3的图 枚举第一个点能到达的所有点,对他们进行BFS求第三层的点(假装它是BFS其实直接枚举效果一样) 代码: #include< ...

  7. java中线程状态-死亡

    线程死亡: 线程会以如下3种方式结束,结束后就处于死亡状态. 1.run()或call()方法执行完成,线程正常结束. 2.线程抛出一个未捕获的Exception或Error 3.直接调用该线程的st ...

  8. 怎么用Python提取域名中的主域名

    从一个域名里面提取主域名,初想起来,貌似很简单,不就是数点[.]的个数吗?取最后一个点前后的字符串,那 abc.txt 是域名吗?那再加个验证,加上国家码,.com,.cn,.org结尾的才算,那这个 ...

  9. Spring -- 入门,装备集合,自动装配,分散装配,自定义编辑器

    1. 概要 struts2:web hibernate:持久化 spring:业务层.管理bean的,容器.List Map Set. 体验spring: 1.创建java项目. 2.引入spring ...

  10. 20165332 预备作业三 Linux安装及命令入门

    Linux安装及命令入门 一.安装Linux操作系统 由于做的比较晚,结合大多数同学的经验和娄老师的<基于VirtualBox虚拟机安装Ubuntu图文教程>,整个安装过程还算顺利,唯一遇 ...