轮子之 PictureSelector(图片选择器)

1、项目地址

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));
  • 参考资料:

参考资料1
参考资料2

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值