写在前面:有什么问题请在评论中指出,不胜感激!!!
图片选择其实在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 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,它是这样介绍的『 可能是最接近微信朋友圈的图片压缩算法 』