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 ...
随机推荐
- PL/SQL编程—变量
SQL> declare c_tax_rate ,):=0.03; v_name ); v_passwd ); v_sale ,); v_tax_sale ,); begin select na ...
- ES6 随记(3.2)-- 正则的拓展 & 数值的拓展
上一章请见: 1. ES6 随记(1)-- let 与 const 2. ES6 随记(2)-- 解构赋值 3. ES6 随记(3.1)-- 字符串的拓展 4. 拓展 b. 正则的拓展 首先又是关于 ...
- 基于SSM的单点登陆04
jdbc.properties JDBC_DRIVER=org.mariadb.jdbc.Driver JDBC_URL=jdbc:mariadb://127.0.0.1:3306/market JD ...
- ubuntu16.04 虚拟机 安装win7/win10
http://www.xitongcheng.com/jiaocheng/xtazjc_article_26588.html https://blog.csdn.net/sunyao_123/arti ...
- 新机git及github sshkey简单配置
新机git简单配置,毕竟不常用,不用每次都查1.安装gitwindows:https://git-scm.com/download/winubuntu: apt install git 2.全局配置 ...
- Linux内核中的信号机制--一个简单的例子【转】
本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123 ...
- AtCoder Regular Contest 098
AtCoder Regular Contest 098 C - Attention 题意 给定一个只包含"E","W"字符串,可以花一的花费使他们互相转换.选定 ...
- Merge-Sort(归并排序)
Merge-Sort(归并排序) 思想 利用分治的思想,具体实现也就是递归,不断的将问题话分为更小的子问题,当子问题中规模为1的时候,认为数组已经有序了,然后再将子问题求得的结果不断的合并.也就是将长 ...
- 关于YII2中编辑页面全局变量冲突问题
今天做一编辑页面时被一个很小的问题困了许久.由于在YII2框架里高度集成了bootstrp框架,在做一个编辑的页面时出现了一个自定义的功能,自定义的字段非数据库表里的字段,所以需要在模型里单独声明一个 ...
- RabbitMQ 简单了解以及使用
RabbitMQ 开发语言:Erlang – 面向并发的编程语言. AMQP:是消息队列的一个协议. mysql 是 java 写的吗?不是 那么 java 能不能访问?可以,则通过(驱动)协议;那么 ...