简介

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. 配置数据库,Flask-Alchemy

    Flask-Alchemy连接数据库的插件 获取当前项目路径(绝对路径) 来自为知笔记(Wiz)

  2. python全栈开发从入门到放弃之字符串的应用

    1.strip strip 脱去(...的)衣服 去掉左右两边的空白msg=' hellprint(msg) 1 print(msg.strip()) #去掉左右两边的空白 2 3 hello 4 h ...

  3. window下rails4.1 发生TZInfo::DataSourceNotFound 错误

    在官网上学习rails 4.1 ,启动rails server之后发生了如下错误 $ rails serverBooting WEBrickRails 4.1.0 application starti ...

  4. JVM(4) 虚拟机性能监控与故障处理工具

    1. Sun JDK 监控和故障处理工具 1)jps:JVM process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.可以列出正在运行的虚拟机进程,并显示虚拟机执行主类( ...

  5. Django CRM 数据库增删改查

    原文链接 http://www.cnblogs.com/yangmv/p/5327477.html

  6. 左连接、右连接、内连接和where

    首先可以看下w3school写的关于join的介绍: http://www.w3school.com.cn/sql/sql_join.asp on是关联条件,where是筛选条件 数据库在通过连接两张 ...

  7. python继承,判断类型,多态

    1.python中继承 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init_ ...

  8. SpringBoot中使用hikariCP

    本篇文章主要实现SpringBoot中使用hikariCP: 一 .使用工具 1. JDK1.8 2. springToolSuit(STS) 3. maven 二.创建项目 1.首先创建一个Spri ...

  9. java 客户端发起http请求2

    客户端请求方式一,如果数据类型为 x-www-form-urlencoded 用到的json jar包为 gradle ('com.alibaba:fastjson:1.2.38',) 那么对应的代码 ...

  10. orecle常用函数

    Oracle SQL 提供了用于执行特定操作的专用函数.这些函数大大增强了 SQL 语言的功能.函数可以接受零个或者多个输入参数,并返回一个输出结果. oracle 数据库中主要使用两种类型的函数 1 ...