由于自己水平不够,只能找这种框架,幸运的是我找到了。而且很好用
我体会到的优点:
1.不用管7.0权限问题,框架给你干好了
2.不用管6.0权限问题,框架也搞好了
3.灵活性极强,可压缩、裁剪、多选、单选…………
4.调用方便,预览方便,
实为佩服这位大神,附上github链接
第一步、导包、添加权限
compile 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.3'
allprojects {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
maven { url 'https://maven.google.com' }
}
}
AndroidManifest.xml添加权限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
第二步、使用
贼简单,这里说一下我用到的包含拍照、相册的
直接Activity代码:
findViewById(R.id.select).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
photoAndCamera();
}
});
// 启动相册、拍照:
public void photoAndCamera(){
PictureSelector.create(MainActivity.this)
.openGallery(PictureMimeType.ofImage())
.forResult(PictureConfig.CHOOSE_REQUEST);
}
我想知道还有sei,这么方便。就到了相册展示页面。
选择了图片咱得回来展示吧:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case PictureConfig.CHOOSE_REQUEST:
// 图片选择结果回调
selectList = PictureSelector.obtainMultipleResult(data);
// 例如 LocalMedia 里面返回三种 path
// 1.media.getPath(); 为原图 path
// 2.media.getCutPath();为裁剪后 path,需判断 media.isCut();是否为 true
// 3.media.getCompressPath();为压缩后 path,需判断 media.isCompressed();是否为 true
// 如果裁剪并压缩了,以取压缩路径为准,因为是先裁剪后压缩的
for(int i=0;ibreak;
}
}
}
就是这么简单啦!!!
gridview展示图片和适配器就自己写吧,相信难不倒大家。
中间出现了两个小问题
.gridview展示预览,很简单的,在其点击事件里面写
PictureSelector.create(MainActivity.this).externalPicturePreview(i, "/custom_file",selectList );
PictureSelector.create(MainActivity.this).externalPicturePreview(i, selectList);
在gridview适配器中,需要图片的显示,此框架集成了最新的Glide框架,所以我们使用的时候不需要再次集成了。但是这里有个新的问题就是原来的那种Glide.placeholder()这种方式不能行了,简单搞定:
RequestOptions options = new RequestOptions();
options.placeholder(R.mipmap.ic_launcher)
.centerCrop();
Glide.with(MainActivity.this)
.load(path)
.apply(options)
.into(holder.image);
虽然我没有感觉到混淆设置的作用,但是还是建议加上,
#PictureSelector 2.0
-keep class com.luck.picture.lib.** { *; }
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
#rxjava
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#rxandroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
#glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
# for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
再附上常用方法:
// 进入相册 以下是例子:用不到的 api 可以不写
PictureSelector.create(MainActivity.this)
.openGallery()//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()
.theme()//主题样式(不设置为默认样式) 也可参考 demo values/styles 下 例如:R.style.picture.white.style
.maxSelectNum()// 最大图片选择数量 int
.minSelectNum()// 最小选择数量 int
.imageSpanCount(4)// 每行显示个数 int
.selectionMode()// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
.previewImage()// 是否可预览图片 true or false
.previewVideo()// 是否可预览视频 true or false
.enablePreviewAudio() // 是否可播放音频 true or false
.compressGrade()// luban 压缩档次,默认 3 档 Luban.THIRD_GEAR、Luban.FIRST_GEAR、Luban.CUSTOM_GEAR
.isCamera()// 是否显示拍照按钮 true or false
.isZoomAnim(true)// 图片列表点击 缩放效果 默认 true
.sizeMultiplier(0.5f)// glide 加载图片大小 0~1 之间 如设置 .glideOverride()无效
.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
.enableCrop()// 是否裁剪 true or false
.compress()// 是否压缩 true or false
.compressMode()//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE
.glideOverride()// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
.withAspectRatio()// int 裁剪比例 如 16:9 3:2 3:4 1:1 可自定义
.hideBottomControls()// 是否显示 uCrop 工具栏,默认不显示 true or false
.isGif()// 是否显示 gif 图片 true or false
.freeStyleCropEnabled()// 裁剪框是否可拖拽 true or false
.circleDimmedLayer()// 是否圆形裁剪 true or false
.showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为 false true or false
.showCropGrid()// 是否显示裁剪矩形网格 圆形裁剪时建议设为 false true or false
.openClickSound()// 是否开启点击声音 true or false
.selectionMedia()// 是否传入已选图片 List list
.previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
.cropCompressQuality()// 裁剪压缩质量 默认 90 int
.compressMaxKB()//压缩最大值 kb compressGrade()为 Luban.CUSTOM_GEAR 有效 int
.compressWH() // 压缩宽高比 compressGrade()为 Luban.CUSTOM_GEAR 有效 int
.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 int
.rotateEnabled() // 裁剪是否可旋转图片 true or false
.scaleEnabled()// 裁剪是否可放大缩小图片 true or false
.videoQuality()// 视频录制质量 0 or 1 int
.videoSecond()// 显示多少秒以内的视频 or 音频也可适用 int
.recordVideoSecond()//视频秒数录制 默认 60s int
.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调 onActivityResult code
这样就稳滴很,整个也就这样了,再次感谢框架大神,我只是代码搬运工。
本人不提倡重复造轮子,但是有时间一定要试着去研究别人怎么造的。