知乎图片选择器使用

Matisse Android 图片选择器 详细使用方式

前言

我们在做App的时候很多需求都要选择图片
比如说:

  • 上传头像
  • 上传朋友圈
  • 发送图片
  • 内容编辑插入图片

我们也可以使用系统的组件来完成我们的需求

Intent toGallery = new Intent(Intent.ACTION_GET_CONTENT);
toGallery.setType("image/*");
toGallery.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(toGallery, REQUEST_GALLERY);


 @Override//返回选择照片的Uri
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Uri uri = data.getData();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

通过这种方式打开系统中支持文件选择的Activity,选取我们需要的照片,然而这种方式并不是特别美观,很多时候不能达到我们想要的效果,而且开源盛世的今天,有许多选择库提供我们选择,使用也非常简单!
今天给大家介绍知乎开源的选择图片的库——Matisse

效果预览

分别是 白天模式(蓝色主题)、夜间模式(暗色主题)、预览效果图

Github地址:

https://github.com/zhihu/Matisse

优点

  • 简单容易上手
  • 支持日夜间模式,可以自定义主题
  • 自定义选中图片的最大数
  • JPEG, PNG, GIF 图片类型的显示
  • 支持有序选择图片,也即选择图片的时候会有 1, 2, 3, 4… 样式的 CheckBox;
  • 支持自定义筛选,完全自定义筛选规则
  • 可以定义图片缩略图的缩放比例。
  • 支持横竖屏。Matisse 做了状态保存的工作
  • 支持不同的图片加载库,目前支持 Glide 和 Picasso

如何使用

第一步

添加依赖

Gradle:

repositories {
    jcenter()
}

dependencies {
    compile 'com.zhihu.android:matisse:0.5.0-alpha4'
    compile 'com.github.bumptech.glide:glide:3.7.0'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

也要添加上glide的包,图片加载器,用glide演示

第二步

Matiss须要添加两个权限,如果是6.0+的版本,须要申请运行时权限,否则报错

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 1
  • 2

如果你使用 Glide 作为你的图片加载引擎,请添加 Glide 的 README 上所说的规则,以及添加额外的规则:

-dontwarn com.squareup.picasso.**
  • 1

如果你使用 Picasso 作为你的图片加载引擎,请添加 Picasso 的 README 上所说的规则,以及添加额外的规则:

-dontwarn com.bumptech.glide.**
  • 1

第三步

如果你不需要点击拍照,而且也对过滤没有要求的话就可以直接使用了

跳转到MatisseActivity从你当前的Activity或者Fragment

基本使用方式

1.定义常量

private static final int REQUEST_CODE_CHOOSE = 23;//定义请求码常量
  • 1

2.启动MatisseActivity

Matisse  
.from(MainActivity.this)
.choose(MimeType.allOf())//照片视频全部显示
.countable(true)//有序选择图片
.maxSelectable(9)//最大选择数量为9
.gridExpectedSize(120)//图片显示表格的大小getResources()
        .getDimensionPixelSize(R.dimen.grid_expected_size)
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)//图像选择和预览活动所需的方向。
.thumbnailScale(0.85f)//缩放比例
.theme(R.style.Matisse_Zhihu)//主题  暗色主题 R.style.Matisse_Dracula
.imageEngine(new GlideEngine())//加载方式
.forResult(REQUEST_CODE_CHOOSE);//请求码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3、接收选择的结果

  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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意事项

关于拍照

想要使用拍照功能的话,必须要有一个Fileprovider

在Android Manifest当中的Application节点下添加FileProvider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.example.fileprovider" 
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths" />
</provider>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

然后在Res文件下创建xml文件夹,然后创建filepaths.xml

authorites是你项目的包名 + fileprovider

filepaths的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="my_images"
        path="Pictures"/>
</paths>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如果对FileProvider不了解可以看一下这篇文章 FileProvider建立文件分享

这里的authority要和Manifest当中保持一致

在启动Matisse当中添加如下代码

.capture(true) //是否提供拍照功能
.captureStrategy(new CaptureStrategy(true,String authority))//存储到哪里 
  • 1
  • 2

关于过滤器

想要使用过滤器的话,必须要自定义过滤器,继承Filter。

这里我已经定义好了,直接用就可以,要是有特别的需求自己实现,可以添加多个过滤器

class GifSizeFilter extends Filter {

private int mMinWidth;
private int mMinHeight;
private int mMaxSize;

GifSizeFilter(int minWidth, int minHeight, int maxSizeInBytes) {
    mMinWidth = minWidth;
    mMinHeight = minHeight;
    mMaxSize = maxSizeInBytes;
}

@Override
public Set<MimeType> constraintTypes() {
    return new HashSet<MimeType>() {{
            add(MimeType.GIF);
            add(MimeType.MP4);
        }};
}

@Override
public IncapableCause filter(Context context, Item item) {
    if (!needFiltering(context, item))
        return null;

    Point size = PhotoMetadataUtils.getBitmapBound(context.getContentResolver(), item.getContentUri());
    if (size.x < mMinWidth || size.y < mMinHeight || item.size > mMaxSize) {
        return new IncapableCause(IncapableCause.DIALOG, context.getString(R.string.error_gif, mMinWidth,
                String.valueOf(PhotoMetadataUtils.getSizeInMB(mMaxSize))));
    }
    return null;
}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

定义好之后在启动MatisseActivity的方法中添加如下代码

.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
  • 1

关于Api

方法名描述参数
showSingleMediaType()仅仅显示一种媒体类型Boolean
from()传递当前的Activity或者fragmentMainActivity.this
choose()显示图片的类型MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF) 或者MimeType.ofAll()
countable()是否有序选择图片Boolean
maxSelectable()最大的选择数量int类型 多少都可以
addFilter()添加过滤器new GifSizeFilter(320, 320, 5 Filter.K Filter.K),自己重写过滤器
gridExpectedSize()每个图片方格的大小120dp
restrictOrientation()设置图像选择和预览活动所需的方向ActivityInfo.SCREEN_ORIENTATION_PORTRAIT或者
thumnailScale()缩放比例0.1-1之间,一般0.85f
imageEngine()使用图片的加载方式new GlideEngine()或者new PicassoEngine()
theme()主题的设置R.style.Matisse_Zhihu 或者 R.style.Matisse_Dracula
forResult()请求码REQUEST_CODE_CHOOSE

包含的类

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

效果预览 
这里写图片描述


完整Dome下载路径http://download.csdn.net/download/qiaoshi96_bk/9911794

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值