Matisse Android图片选择器详细使用

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();
}

通过这种方式打开系统中支持文件选择的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'
}

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

第二步

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

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

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

-dontwarn com.squareup.picasso.**

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

-dontwarn com.bumptech.glide.**

第三步

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

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

基本使用方式
1.定义常量
private static final int REQUEST_CODE_CHOOSE = 23;//定义请求码常量
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);//请求码
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);
    }
}

注意事项

关于拍照

想要使用拍照功能的话,必须要有一个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>

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

authorites是你项目的包名 + fileprovider

filepaths的代码如下:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="my_images"
        path="Pictures"/>
</paths>

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

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

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

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

关于过滤器

想要使用过滤器的话,必须要自定义过滤器,继承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;
}

}

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

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

关于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


  • 6
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
Android图片选择器是一种常用的工具,它可以帮助开发者在Android应用中实现图片选择的功能。通过图片选择器,用户可以从相册或者其他存储位置中选择图片,并将其用于应用中的各种场景,比如头像上传、图片展示等。 Android平台上有很多开源的图片选择器库可供使用,其中比较常用的有以下几个: 1. Glide:Glide是一个强大的图片加载和缓存库,它不仅可以加载网络图片,还可以加载本地图片和资源文件中的图片。Glide提供了简单易用的API,可以方便地实现图片选择和展示功能。 2. Picasso:Picasso是另一个流行的图片加载库,它也提供了简单易用的API,并且具有自动内存和磁盘缓存的功能。Picasso支持从网络、本地和资源文件中加载图片,并且可以自动处理图片的缩放和裁剪。 3. UCrop:UCrop是一个强大的图片裁剪库,它可以帮助开发者实现图片裁剪的功能。UCrop支持手势缩放、旋转和裁剪操作,并且提供了丰富的配置选项,可以满足不同场景下的需求。 4. MatisseMatisse是一个功能丰富的图片选择器库,它提供了多种样式的图片选择界面,并且支持多选、预览和裁剪等功能。Matisse还支持自定义主题和样式,可以根据应用的需求进行个性化定制。 以上是一些常用的Android图片选择器库,它们都具有不同的特点和功能,开发者可以根据自己的需求选择合适的库来实现图片选择功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值