Matisse,来自知乎的PhotoPicker
简介
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的更多相关文章
- java提升路线书单(原文自知乎刘欣)
复制黏贴自知乎刘欣大神,作为个人的书单与指导路线 原文链接:https://www.zhihu.com/question/19848946/answer/92536822 刘欣 追寻内心的真正兴趣 ...
- Android带多选功能的PhotoPicker
最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一 ...
- Android高仿微信图片选择功能的PhotoPicker
类似于微信修改头像的功能基本上每个app都会有,以前公司开发的项目就有修改头像的功能,但是用的Android系统自带的图片选择器.用Android系统的图片选择器有个好处就是稳定,不会有什么问题.但也 ...
- CSS层叠样式表的层叠是什么意思(转自知乎)
转自知乎上的回答:http://www.zhihu.com/question/20077745 解答一: 层叠指的是样式的优先级,当产生冲突时以优先级高的为准.1. 开发者样式>读者样式> ...
- 使用MyEclipse Swing/Matisse
经常使用JBuilder开发工具的人都知道,在JBuilder中开发Swing应用程序是比较方便的,虽然比不上曾经红遍一时的Visual Basic,但开发界面的工作确实被大大简化了. JB ...
- IOS学习经验总结--来自知乎网友
转自知乎:http://www.zhihu.com/question/20016551 我当时刚学iOS开发的时候一样的感觉 总想知道原理 内部怎么回事 感觉在像在雾里但是iOS开发就是这样 他是封闭 ...
- <Android 开源库> PhotoPicker 从头到脚
1. 简介 PhotoPicker, 是一款开源的图片选择器.效果上和微信相似. 2. 使用方法 2.1 添加依赖 dependencies { compile 'me.iwf.photopicker ...
- 你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT
你曾后悔进入 IT 行业吗?为什么?(转自知乎)--一生不悔入IT 一.总结 一句话总结:看了大概200条评论,99%的不后悔,大部分人后悔没有早点干,但是做it最最主要的是要注意身体. 1.it是最 ...
- PhotoPicker 从头到脚
1. 简介 PhotoPicker, 是一款开源的图片选择器.效果上和微信相似. 2. 使用方法 2.1 添加依赖 dependencies { compile 'me.iwf.photopicker ...
随机推荐
- js 数组判断是否包含某元素 或 数组去重
判断包含: 1.借助 jquery $.inArray(obj.UNIVERSITY_NAME, arryDatas) < 0var arr = [ "xml", &quo ...
- C#中跨库事务处理解决方案
最近新接手了一项业务,其中有一个方法,需要对业务表进行写入数据,之后记录到日志表中.这部分代码原先是前人写的,他没有采用任何方案,只是简单的调用Ado.net执行了两次写库操作.因此经常出现系统使用者 ...
- SQL server 数据库 操作及简单查询
使用SQL Sever语言进行数据库的操作 常用关键字identity 自增长primary key 主键unique 唯一键not null 非空references 外键(引用) 在使用查询操作数 ...
- Spring中的定时调度(Scheduling)和线程池(Thread Pooling)
使用triggers和SchedulerFactoryBean来包装任务 我们已经创建了job details,jobs.我们同时回顾了允许你调用特定对象上某一个方法的便捷的bean. 当然我们仍需要 ...
- oracle 任务使用
文章访问地址:http://www.cnblogs.com/hoojo/p/oracle_procedure_job_interval.html
- LigerUI LigerGird IE7/8 下不显示 “in”的操作数无效
LigerUI IE7/8 下显示 in的操作数无效 修改脚本生成LigerGrid的地方,将最后一列后面的,去掉
- 20145109 《Java实验报告1》
Experiment Ⅰ --getting familiar with JDK (Linux + Eclipse) Content 1.Compile and run easy Java progr ...
- COS-6主存管理
操作系统是用户和计算机的接口,同时也是计算机硬件和其他软件的接口.操作系统的功能包括管理计算机系统的硬件.软件及数据资源,控制程序运行,改善人机界面,为其它应用软件提供支持,让计算机系统所有资源最大限 ...
- 聊聊这两天在linux安装PHP7遇到的坑,真的是坑死人不偿命啊
前情摘要: 这两天要在虚拟机上部署项目,用于测试在linux上项目效果怎样,然后这两天就一直在部署apache+mysql+php 其实部署还是很简单的具体的apache和mysql部署方法请看其他两 ...
- 洛谷P4311 士兵占领
题目描述 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放置了Li个士兵 ...


