Matisse 知乎图片选择框架

写在前面:有什么问题请在评论中指出,不胜感激!!!

图片选择其实在APP中还是很常用的,最简单的都是头像选择,拍照或者从相册中选择,发表一下心情的时候也会需要使用。
图片选择框架 github上有很多,比如PhotoPicker是吧,但是像Matisse这么萌萌哒的还是比较少的,而且一般来说爱啪啪中是只有选择图片的,如果需要加上选择视频,是不是有需要重新添加一个框架,或者说自己写一个,当然,还是选择同一个的好,这个时候Matisse就体现出他的价值了。

github地址 Matisse https://github.com/zhihu/Matisse

现在开始使用 implementation 'com.zhihu.android:matisse:0.5.2-beta2'

注意这个版本是可以选择图片和视频,我目前在用,还没有出现什么bug,并且图片支持的格式更多(JPEG, PNG, GIF, BMP, WEBP),图片格式(MPEG, MP4, QUICKTIME, THREEGPP, THREEGPP2, MKV, WEBM, TS, AVI),是不是感觉有点厉害了

1.没图你用个毛线,先来张图,看看是不是你喜欢的风格,不喜欢,下面就不用看了。


选择图片
选择视频

2.看过了效果图,现在是不是感觉有点好看的,开始简单使用一下,这里的代码是有问题的,请自行选择使用!!!!!!还有一些其他的方法,这里就不再一一表述,基本用不到,比如缩略图的宽高,间隙,基本上一行3个是标配。其他的可以自行找找方法。

Matisse
                .from(mActivity)
                //选择视频和图片
                .choose(MimeType.ofAll()) 
                //选择图片
                .choose(MimeType.ofImage()) 
                //选择视频
                .choose(MimeType.ofVideo()) 
                //自定义选择选择的类型
                .choose(MimeType.of(MimeType.JPEG,MimeType.AVI)) 
                //是否只显示选择的类型的缩略图,就不会把所有图片视频都放在一起,而是需要什么展示什么
                .showSingleMediaType(true)
                //这两行要连用 是否在选择图片中展示照相 和适配安卓7.0 FileProvider
                .capture(true)
                .captureStrategy(new CaptureStrategy(true,"PhotoPicker"))
                //有序选择图片 123456...
                .countable(true)
                //最大选择数量为9
                .maxSelectable(9)
                //选择方向
                .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
                //界面中缩略图的质量
                .thumbnailScale(0.8f)
                //蓝色主题
                .theme(R.style.Matisse_Zhihu)
                //黑色主题
                .theme(R.style.Matisse_Dracula)
                //Glide加载方式
                .imageEngine(new GlideEngine())
                //Picasso加载方式
                .imageEngine(new PicassoEngine())
                //请求码
                .forResult(REQUEST_CODE_CHOOSE);

获取图片路径

@Override     
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == case REQUEST_CODE_CHOOSE_PHOTO_ALBUM: && resultCode == RESULT_OK) {
        //图片路径 同样视频地址也是这个 根据requestCode
        List<String> pathList = Matisse.obtainResult(data);       
    }
}

2.图片加载器
说到这个,我的APP中基本上都是使用的Glide,毕竟。。。。。。我也不知道为什么,反正就是用它了,matisse就支持使用Glide,好评!当然还支持Picasso,以及一些其他的都可以实现ImageEngine重写方法进行实现,所以很多Issues中说要使用Glide 4.x的其实也不用这么着急,毕竟稳定是最重要的,我们可以自己实现ImageEngine来完成。

public class GlideImageEngine implements ImageEngine {

    @Override
    public void loadThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .asBitmap()
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);
    }

    @Override
    public void loadGifThumbnail(Context context, int resize, Drawable placeholder, ImageView imageView,
                                 Uri uri) {
        GlideApp.with(context)
                .asBitmap()
                .load(uri)
                .placeholder(placeholder)
                .override(resize, resize)
                .centerCrop()
                .into(imageView);
    }

    @Override
    public void loadImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .into(imageView);
    }

    @Override
    public void loadGifImage(Context context, int resizeX, int resizeY, ImageView imageView, Uri uri) {
        GlideApp.with(context)
                .asGif()
                .load(uri)
                .override(resizeX, resizeY)
                .priority(Priority.HIGH)
                .into(imageView);
    }

    @Override
    public boolean supportAnimatedGif() {
        return true;
    }
}

3.拍照
上面的代码也有说需要FileProvider 这个基本上都知道了吧 百度一大堆
在Android Manifest当中的Application节点下添加FileProvider

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="PhotoPicker"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/photo_path" />
        </provider>

然后在Res文件下创建xml文件夹,然后创建photo_path.xml 注意:这里是不能改路径的就是在Image文件夹下面,如果要改可能就需要自行实现了

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

Matisse都可以使用手机自带拍照那我们就不用这么麻烦去自己写一个了,就是路径需要注意一下,都是在Image文件夹下面,需要从这里找而不是从onActivityResult里面的data中获取,因为这个时候的data为null

MediaStoreCompat mediaStoreCompat = new MediaStoreCompat(mView.getContext());
        mediaStoreCompat.setCaptureStrategy(new CaptureStrategy(true,"PhotoPicker"));
        mediaStoreCompat.dispatchCaptureIntent(mView.getContext(),REQUEST_CODE_CHOOSE_PHOTO_SHOOT);
        //因为是指定Uri所以onActivityResult中的data为空 只能再这里获取拍照的路径
        String currentPhotoPath = mediaStoreCompat.getCurrentPhotoPath();
        //返回图片路径名
        mView.getCurrentPhotoPath(currentPhotoPath);

4.GifFilter
这个就直接从github上复制下来使用就好了

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

    @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;
    }
}

之后还有权限问题,相信了解过的都知道了Matisse是提示申请摄像头权限的,这个就是一个有趣的地方了
Android有两个相机权限:
(1)<uses-feature android:name="android.hardware.camera"/>
(2)<uses-permission android:name="android.permission.CAMERA" />
permission.CAMERA权限
1、在6.0以上是必须需要申请动态权限,否则会闪退
2、可以拍照、录像、扫码
hardware.camera权限
1、只有拍照权限
2、4.0-8.0都不需要相机权限就可以拍照,然而9.0不行(华为p20真机)

到这里有也就差不多了,基本上的使用就在这里了,其他的也基本用不太到,计划下一篇写一下图片压缩,当然也是自己使用的LuBan
https://github.com/Curzibn/Luban
,它是这样介绍的『 可能是最接近微信朋友圈的图片压缩算法 』

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容