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.没图你用个毛线,先来张图,看看是不是你喜欢的风格,不喜欢,下面就不用看了。


Matisse 知乎图片选择框架_第1张图片
选择图片
Matisse 知乎图片选择框架_第2张图片
选择视频

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


            
        

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



    

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 constraintTypes() {
        return new HashSet() {{
            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)
(2)
permission.CAMERA权限
1、在6.0以上是必须需要申请动态权限,否则会闪退
2、可以拍照、录像、扫码
hardware.camera权限
1、只有拍照权限
2、4.0-8.0都不需要相机权限就可以拍照,然而9.0不行(华为p20真机)

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

你可能感兴趣的:(Matisse 知乎图片选择框架)