1、项目地址
- 项目地址:github地址
2、了解
- PictureSelector 是一个从本地选择图片或者拍摄图片的一个图片选择器,具备以下能力:
- 图片的选择及使用相机进行拍摄
- 多图/多视频同时选择
- 大图/视频滑动预览
3、使用
(1)权限申请
- 需要读写权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
(2)可选择属性
- 相册
PictureSelector.create(MainActivity.this)
.openGallery(chooseMode)// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
.imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项
//.theme(themeId)// 主题样式设置 具体参考 values/styles 用法:R.style.picture.white.style v2.3.3后 建议使用setPictureStyle()动态方式
.setPictureUIStyle(mSelectorUIStyle)
//.setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题
//.setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题
.setPictureWindowAnimationStyle(mWindowAnimationStyle)// 自定义相册启动退出动画
.isWeChatStyle(isWeChatStyle)// 是否开启微信图片选择风格
.isUseCustomCamera(cb_custom_camera.isChecked())// 是否使用自定义相机
.setLanguage(language)// 设置语言,默认中文
.isPageStrategy(cbPage.isChecked())// 是否开启分页策略 & 每页多少条;默认开启
.setRecyclerAnimationMode(animationMode)// 列表动画效果
//.setOfAllCameraType(PictureMimeType.ofVideo())
.isWithVideoImage(true)// 图片和视频是否可以同选,只在ofAll模式下有效
//.isSyncCover(true)// 是否强制从MediaStore里同步相册封面,如果相册封面没显示异常则没必要设置
//.isCameraAroundState(false) // 是否开启前置摄像头,默认false,如果使用系统拍照 可能部分机型会有兼容性问题
//.isCameraRotateImage(false) // 拍照图片旋转是否自动纠正
//.isAutoRotating(false)// 压缩时自动纠正有旋转的图片
.isMaxSelectEnabledMask(cbEnabledMask.isChecked())// 选择数到了最大阀值列表是否启用蒙层效果
//.isAutomaticTitleRecyclerTop(false)// 连续点击标题栏RecyclerView是否自动回到顶部,默认true
//.setOutputCameraPath(createCustomCameraOutPath())// 自定义相机输出目录
.setQuerySandboxDirectory(createCustomCameraOutPath())// 查询自定义相机输出目录
.isGetOnlySandboxDirectory(false) // 是否只显示某个目录下的资源;需与setQuerySandboxDirectory相对应
.setCustomCameraFeatures(CustomCameraType.BUTTON_STATE_BOTH)// 设置自定义相机按钮状态
.setCaptureLoadingColor(ContextCompat.getColor(getContext(), R.color.app_color_blue))
.maxSelectNum(maxSelectNum)// 最大图片选择数量
.minSelectNum(1)// 最小选择数量
.maxVideoSelectNum(1) // 视频最大选择数量
//.minVideoSelectNum(1)// 视频最小选择数量
//.closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 关闭在AndroidQ下获取图片或视频宽高相反自动转换
.imageSpanCount(4)// 每行显示个数
//.queryFileSize() // 过滤最大资源,已废弃
//.filterMinFileSize(5)// 过滤最小资源,单位kb
//.filterMaxFileSize()// 过滤最大资源,单位kb
.isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回
.isAndroidQTransform(true)// 是否需要处理Android Q 拷贝至应用沙盒的操作,只针对compress(false); && .isEnableCrop(false);有效,默认处理
.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)// 设置相册Activity方向,不设置默认使用系统
.isOriginalImageControl(cb_original.isChecked())// 是否显示原图控制按钮,如果设置为true则用户可以自由选择是否使用原图,裁剪功能将会失效
.isDisplayOriginalSize(true)// 是否显示原文件大小,isOriginalImageControl true有效
.isEditorImage(cbEditor.isChecked())//是否编辑图片
//.isAutoScalePreviewImage(true)// 如果图片宽度不能充满屏幕则自动处理成充满模式
//.bindCustomPlayVideoCallback(new MyVideoSelectedPlayCallback(getContext()))// 自定义视频播放回调控制,用户可以使用自己的视频播放界面
//.bindCustomPreviewCallback(new MyCustomPreviewInterfaceListener())// 自定义图片预览回调接口
//.bindCustomCameraInterfaceListener(new MyCustomCameraInterfaceListener())// 提供给用户的一些额外的自定义操作回调
//.bindCustomPermissionsObtainListener(new MyPermissionsObtainCallback())// 自定义权限拦截
//.bindCustomChooseLimitListener(new MyChooseLimitCallback()) // 自定义选择限制条件Dialog
//.cameraFileName(System.currentTimeMillis() +".jpg") // 重命名拍照文件名、如果是相册拍照则内部会自动拼上当前时间戳防止重复,注意这个只在使用相机时可以使用,如果使用相机又开启了压缩或裁剪 需要配合压缩和裁剪文件名api
//.renameCompressFile(System.currentTimeMillis() +".jpg")// 重命名压缩文件名、 如果是多张压缩则内部会自动拼上当前时间戳防止重复
//.renameCropFileName(System.currentTimeMillis() + ".jpg")// 重命名裁剪文件名、 如果是多张裁剪则内部会自动拼上当前时间戳防止重复
.selectionMode(cb_choose_mode.isChecked() ?
PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
.isSingleDirectReturn(cb_single_back.isChecked())// 单选模式下是否直接返回,PictureConfig.SINGLE模式下有效
.isPreviewImage(cb_preview_img.isChecked())// 是否可预览图片
.isPreviewVideo(cb_preview_video.isChecked())// 是否可预览视频
//.querySpecifiedFormatSuffix(PictureMimeType.ofJPEG())// 查询指定后缀格式资源
//.queryMimeTypeConditions(PictureMimeType.ofWEBP())
.isEnablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频
.isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮
//.isMultipleSkipCrop(false)// 多图裁剪时是否支持跳过,默认支持
//.isMultipleRecyclerAnimation(false)// 多图裁剪底部列表显示动画效果
.isZoomAnim(true)// 图片列表点击 缩放效果 默认true
//.imageFormat(PictureMimeType.PNG) // 拍照保存图片格式后缀,默认jpeg,Android Q使用PictureMimeType.PNG_Q
.setCameraImageFormat(PictureMimeType.JPEG) // 相机图片格式后缀,默认.jpeg
.setCameraVideoFormat(PictureMimeType.MP4)// 相机视频格式后缀,默认.mp4
.setCameraAudioFormat(PictureMimeType.AMR)// 录音音频格式后缀,默认.amr
.isEnableCrop(cb_crop.isChecked())// 是否裁剪
//.basicUCropConfig()//对外提供所有UCropOptions参数配制,但如果PictureSelector原本支持设置的还是会使用原有的设置
.isCompress(cb_compress.isChecked())// 是否压缩
//.compressFocusAlpha(true)// 压缩时是否开启透明通道
//.compressEngine(ImageCompressEngine.createCompressEngine()) // 自定义压缩引擎
//.compressQuality(80)// 图片压缩后输出质量 0~ 100
.synOrAsy(false)//同步true或异步false 压缩 默认同步
//.queryMaxFileSize(10)// 只查多少M以内的图片、视频、音频 单位M
//.compressSavePath(getPath())//压缩图片保存地址
.withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
.hideBottomControls(!cb_hide.isChecked())// 是否显示uCrop工具栏,默认不显示
.isGif(cb_isGif.isChecked())// 是否显示gif图片
//.isWebp(false)// 是否显示webp图片,默认显示
//.isBmp(false)//是否显示bmp图片,默认显示
.freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
//.freeStyleCropMode(OverlayView.DEFAULT_FREESTYLE_CROP_MODE)// 裁剪框拖动模式
.isCropDragSmoothToCenter(true)// 裁剪框拖动时图片自动跟随居中
.circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
//.setCropDimmedColor(ContextCompat.getColor(getContext(), R.color.app_color_white))// 设置裁剪背景色值
//.setCircleDimmedBorderColor(ContextCompat.getColor(getApplicationContext(), R.color.app_color_white))// 设置圆形裁剪边框色值
//.setCircleStrokeWidth(3)// 设置圆形裁剪边框粗细
.showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
.showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
.isOpenClickSound(cb_voice.isChecked())// 是否开启点击声音
.selectionData(mAdapter.getData())// 是否传入已选图片
//.isDragFrame(false)// 是否可拖动裁剪框(固定)
//.videoMinSecond(10)// 查询多少秒以内的视频
//.videoMaxSecond(15)// 查询多少秒以内的视频
//.recordVideoSecond(10)//录制视频秒数 默认60s
//.isPreviewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
//.cropCompressQuality(90)// 注:已废弃 改用cutOutQuality()
.cutOutQuality(90)// 裁剪输出质量 默认100
//.cutCompressFormat(Bitmap.CompressFormat.PNG.name())//裁剪图片输出Format格式,默认JPEG
.minimumCompressSize(100)// 小于多少kb的图片不压缩
//.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效
//.cropImageWideHigh()// 裁剪宽高比,设置如果大于图片本身宽高则无效
//.rotateEnabled(false) // 裁剪是否可旋转图片
//.scaleEnabled(false)// 裁剪是否可放大缩小图片
//.videoQuality()// 视频录制质量 0 or 1
//.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
//.forResult(new MyResultCallback(mAdapter));
.forResult(launcherResult);
- 拍照
PictureSelector.create(MainActivity.this)
.openCamera(chooseMode)// 单独拍照,也可录像或也可音频 看你传入的类型是图片or视频
.theme(themeId)// 主题样式设置 具体参考 values/styles
.imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项
.setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题
.setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题
.setPictureWindowAnimationStyle(mWindowAnimationStyle)// 自定义相册启动退出动画
.maxSelectNum(maxSelectNum)// 最大图片选择数量
.isUseCustomCamera(cb_custom_camera.isChecked())// 是否使用自定义相机
.setOutputCameraPath(createCustomCameraOutPath()) // 自定义相机输出目录
.setQuerySandboxDirectory(createCustomCameraOutPath())// 查询自定义相机输出目录
.isGetOnlySandboxDirectory(false) // 是否只显示某个目录下的资源;需与setQuerySandboxDirectory相对应
.minSelectNum(1)// 最小选择数量
//.querySpecifiedFormatSuffix(PictureMimeType.ofPNG())// 查询指定后缀格式资源
.selectionMode(cb_choose_mode.isChecked() ?
PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选
//.cameraFileName(System.currentTimeMillis() + ".jpg")// 使用相机时保存至本地的文件名称,注意这个只在拍照时可以使用
//.renameCompressFile(System.currentTimeMillis() + ".jpg")// 重命名压缩文件名、 注意这个不要重复,只适用于单张图压缩使用
//.renameCropFileName(System.currentTimeMillis() + ".jpg")// 重命名裁剪文件名、 注意这个不要重复,只适用于单张图裁剪使用
.isPreviewImage(cb_preview_img.isChecked())// 是否可预览图片
.isPreviewVideo(cb_preview_video.isChecked())// 是否可预览视频
.isEnablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频
.isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮
.isAndroidQTransform(true)// 是否需要处理Android Q 拷贝至应用沙盒的操作,只针对compress(false); && .isEnableCrop(false);有效,默认处理
.isEnableCrop(cb_crop.isChecked())// 是否裁剪
//.basicUCropConfig()//对外提供所有UCropOptions参数配制,但如果PictureSelector原本支持设置的还是会使用原有的设置
.isCompress(cb_compress.isChecked())// 是否压缩
.compressQuality(60)// 图片压缩后输出质量
.withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
.hideBottomControls(!cb_hide.isChecked())// 是否显示uCrop工具栏,默认不显示
.isGif(cb_isGif.isChecked())// 是否显示gif图片
.freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽
.freeStyleCropMode(OverlayView.DEFAULT_FREESTYLE_CROP_MODE)// 裁剪框拖动模式
.circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪
//.setCircleDimmedColor(ContextCompat.getColor(this, R.color.app_color_white))// 设置圆形裁剪背景色值
//.setCircleDimmedBorderColor(ContextCompat.getColor(this, R.color.app_color_white))// 设置圆形裁剪边框色值
//.setCircleStrokeWidth(3)// 设置圆形裁剪边框粗细
.showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
.showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
.isOpenClickSound(cb_voice.isChecked())// 是否开启点击声音
.selectionData(mAdapter.getData())// 是否传入已选图片
.isAutoScalePreviewImage(true)// 如果图片宽度不能充满屏幕则自动处理成充满模式
//.isPreviewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
//.cropCompressQuality(90)// 废弃 改用cutOutQuality()
.cutOutQuality(90)// 裁剪输出质量 默认100
.minimumCompressSize(100)// 小于100kb的图片不压缩
//.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效
//.cropImageWideHigh()// 裁剪宽高比,设置如果大于图片本身宽高则无效
//.rotateEnabled() // 裁剪是否可旋转图片
//.scaleEnabled()// 裁剪是否可放大缩小图片
//.videoQuality()// 视频录制质量 0 or 1
//.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code
.forResult(new MyResultCallback(mAdapter));
- 参考资料: