赞
踩
多图选择是Android中一个常用的功能,用户可以拍照或者批量选择图片上传,还是国际惯例,先看下效果图,demo地址我会放到文章末尾。
type.png
album.png
detail.png
home.png
经过对比,这里我选择了一个第三方开源库PictureSelector,GitHub地址是
https://github.com/LuckSiege/PictureSelector,已经7k以上的star,目前还在维护。是一个支持拍照或从相册选择图片、视频、音频,支持动态权限获取、裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能、适配android 6.0+系统的开源图片选择框架,功能很齐全,并且作者也进行了兼容性测试。
功能特点
集成方式
Step 1. 添加JitPack仓库
项目根目录build.gradle加入
- allprojects {
- repositories {
- google()
- jcenter()
- maven { url 'https://jitpack.io' }
- }
- }
Step 2. 添加依赖
在module的build.gradle加入
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.2.4'
Step 3. 添加权限
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.CAMERA" />
Step 4. 拍照或打开相册
- //拍照
- PictureSelector.create(MainActivity.this)
- .openCamera(PictureMimeType.ofImage())
- .forResult(PictureConfig.CHOOSE_REQUEST);
- //相册
- PictureSelector.create(MainActivity.this)
- .openGallery(PictureMimeType.ofImage())
- .maxSelectNum(maxSelectNum)
- .minSelectNum(1)
- .imageSpanCount(4)
- .selectionMode(PictureConfig.MULTIPLE)
- .forResult(PictureConfig.CHOOSE_REQUEST);
Step 5. 获取结果回调
- @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:
- // 图片选择结果回调
- List<LocalMedia> images= PictureSelector.obtainMultipleResult(data);
- break;
- }
- }
- }
缓存清除
一般图片上传成功后需要清除缓存,避免OOM,这里需要SD卡权限,如下
- /**
- * 清空图片缓存,包括裁剪、压缩后的图片
- */
- private void clearCache() {
- RxPermissions permissions = new RxPermissions(this);
- permissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Observer<Boolean>() {
- @Override
- public void onSubscribe(Disposable d) {
- }
-
- @Override
- public void onNext(Boolean aBoolean) {
- if (aBoolean) {
- //清除缓存
- PictureFileUtils.deleteCacheDirFile(MainActivity.this);
- }
- }
-
- @Override
- public void onError(Throwable e) {
- }
-
- @Override
- public void onComplete() {
- }
- });
- }
主题配置
- <!--默认样式 注意* 样式只可修改,不能删除任何一项 否则报错-->
- <style name="picture.default.style" parent="Theme.AppCompat.Light.DarkActionBar">
- <!-- Customize your theme here. -->
- <!--标题栏背景色-->
- <item name="colorPrimary">@color/bar_grey</item>
- <!--状态栏背景色-->
- <item name="colorPrimaryDark">@color/bar_grey</item>
- <!--是否改变图片列表界面状态栏字体颜色为黑色-->
- <item name="picture.statusFontColor">false</item>
- <!--返回键图标-->
- <item name="picture.leftBack.icon">@drawable/picture_back</item>
- <!--标题下拉箭头-->
- <item name="picture.arrow_down.icon">@drawable/arrow_down</item>
- <!--标题上拉箭头-->
- <item name="picture.arrow_up.icon">@drawable/arrow_up</item>
- <!--标题文字颜色-->
- <item name="picture.title.textColor">@color/white</item>
- <!--标题栏右边文字-->
- <item name="picture.right.textColor">@color/white</item>
- <!--图片列表勾选样式-->
- <item name="picture.checked.style">@drawable/checkbox_selector</item>
- <!--开启图片列表勾选数字模式-->
- <item name="picture.style.checkNumMode">false</item>
- <!--选择图片样式0/9-->
- <item name="picture.style.numComplete">false</item>
- <!--图片列表底部背景色-->
- <item name="picture.bottom.bg">@color/color_fa</item>
- <!--图片列表预览文字颜色-->
- <item name="picture.preview.textColor">@color/tab_color_true</item>
- <!--图片列表已完成文字颜色-->
- <item name="picture.complete.textColor">@color/tab_color_true</item>
- <!--图片已选数量圆点背景色-->
- <item name="picture.num.style">@drawable/num_oval</item>
- <!--预览界面标题文字颜色-->
- <item name="picture.ac_preview.title.textColor">@color/white</item>
- <!--预览界面已完成文字颜色-->
- <item name="picture.ac_preview.complete.textColor">@color/tab_color_true</item>
- <!--预览界面标题栏背景色-->
- <item name="picture.ac_preview.title.bg">@color/bar_grey</item>
- <!--预览界面底部背景色-->
- <item name="picture.ac_preview.bottom.bg">@color/bar_grey_90</item>
- <!--预览界面返回箭头-->
- <item name="picture.preview.leftBack.icon">@drawable/picture_back</item>
- <!--是否改变预览界面状态栏字体颜色为黑色-->
- <item name="picture.preview.statusFontColor">false</item>
- <!--裁剪页面标题背景色-->
- <item name="picture.crop.toolbar.bg">@color/bar_grey</item>
- <!--裁剪页面状态栏颜色-->
- <item name="picture.crop.status.color">@color/bar_grey</item>
- <!--裁剪页面标题文字颜色-->
- <item name="picture.crop.title.color">@color/white</item>
- <!--相册文件夹列表选中图标-->
- <item name="picture.folder_checked_dot">@drawable/orange_oval</item>
- </style>
功能配置
- // 进入相册 以下是例子:用不到的api可以不写
- PictureSelector.create(MainActivity.this)
- .openGallery()//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
- .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
- .isCamera()// 是否显示拍照按钮 true or false
- .imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
- .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
- .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
- .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填
- .enableCrop()// 是否裁剪 true or false
- .compress()// 是否压缩 true or false
- .glideOverride()// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度
- .withAspectRatio()// int 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
- .hideBottomControls()// 是否显示uCrop工具栏,默认不显示 true or false
- .isGif()// 是否显示gif图片 true or false
- .compressSavePath(getPath())//压缩图片保存地址
- .freeStyleCropEnabled()// 裁剪框是否可拖拽 true or false
- .circleDimmedLayer()// 是否圆形裁剪 true or false
- .showCropFrame()// 是否显示裁剪矩形边框 圆形裁剪时建议设为false true or false
- .showCropGrid()// 是否显示裁剪矩形网格 圆形裁剪时建议设为false true or false
- .openClickSound()// 是否开启点击声音 true or false
- .selectionMedia()// 是否传入已选图片 List<LocalMedia> list
- .previewEggs()// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false
- .cropCompressQuality()// 裁剪压缩质量 默认90 int
- .minimumCompressSize(100)// 小于100kb的图片不压缩
- .synOrAsy(true)//同步true或异步false 压缩 默认同步
- .cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 int
- .rotateEnabled() // 裁剪是否可旋转图片 true or false
- .scaleEnabled()// 裁剪是否可放大缩小图片 true or false
- .videoQuality()// 视频录制质量 0 or 1 int
- .videoMaxSecond(15)// 显示多少秒以内的视频or音频也可适用 int
- .videoMinSecond(10)// 显示多少秒以内的视频or音频也可适用 int
- .recordVideoSecond()//视频秒数录制 默认60s int
- .isDragFrame(false)// 是否可拖动裁剪框(固定)
- .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。