百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Android多图选择

wptr33 2024-12-08 19:09 19 浏览

多图选择是Android中一个常用的功能,用户可以拍照或者批量选择图片上传,还是国际惯例,先看下效果图,demo地址我会放到文章末尾。






经过对比,这里我选择了一个第三方开源库PictureSelector,GitHub地址是
https://github.com/LuckSiege/PictureSelector,已经7k以上的star,目前还在维护。是一个支持拍照或从相册选择图片、视频、音频,支持动态权限获取、裁剪(单图or多图裁剪)、压缩、主题自定义配置等功能、适配android 6.0+系统的开源图片选择框架,功能很齐全,并且作者也进行了兼容性测试。

功能特点

  • 1.适配android6.0+系统
  • 2.解决部分机型裁剪闪退问题
  • 3.解决图片过大oom闪退问题
  • 4.动态获取系统权限,避免闪退
  • 5.支持相片or视频的单选和多选
  • 6.支持裁剪比例设置,如常用的 1:1、3:4、3:2、16:9 默认为图片大小
  • 7.支持视频预览
  • 8.支持gif图片
  • 9.支持.webp格式图片
  • 10.支持一些常用场景设置:如:是否裁剪、是否预览图片、是否显示相机等
  • 11.新增自定义主题设置
  • 12.新增图片勾选样式设置
  • 13.新增图片裁剪宽高设置
  • 14.新增图片压缩处理
  • 15.新增录视频最大时间设置
  • 16.新增视频清晰度设置
  • 17.新增QQ选择风格,带数字效果
  • 18.新增自定义 文字颜色 背景色让风格和项目更搭配
  • 19.新增多图裁剪功能
  • 20.新增LuBan多图压缩
  • 21.新增单独拍照功能
  • 22.新增压缩大小设置
  • 23.新增Luban压缩档次设置
  • 24.新增圆形头像裁剪
  • 25.新增音频功能查询


集成方式


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


demo地址:https://github.com/yangxch/MultiPictureSelection

相关推荐

HIVE 窗口函数详解(hive常用开窗函数)

什么是窗口函数窗口函数是SQL中一类特别的函数。和聚合函数相似,窗口函数的输入也是多行记录。不同的是,聚合函数的作用于由GROUPBY子句聚合的组,而窗口函数则作用于一个窗口,这里,窗口...

SQL高效使用20招:数据分析师必备技巧

基础优化技巧善用EXPLAIN分析执行计划EXPLAINSELECT*FROMordersWHEREorder_date>'2024-01-01';...

答记者问之 - Redis 的高效架构与应用模式解析

问:极客程序员你好,请帮我讲一讲redis答:redis主要涉及以下核心,我来一一揭幕Redis的高效架构与应用模式解析...

MySQL通过累计求新增(mysql新增表字段语句)

前两天的那篇内容《MySQL递归实现单列分列成多行》...

一文讲懂SQL窗口函数 大厂必考知识点

大家好,我是宁一。今天是我们的第24课:窗口函数。...

圣诞快乐:用GaussDB T 绘制一颗圣诞树,兼论高斯数据库语法兼容

转眼就是圣诞的节日,祝大家节日快乐。用GaussDBT(也就是GaussDB100)绘制一棵圣诞树,纯国产,更喜庆。话不多说,上图:SQL如下:SELECTCASEWHENENMOTE...

Minitab:功能强大的质量管理、统计分析及统计图形软件

一、Minitab简介Minitab软件是为质量改善、教育和研究应用领域提供统计软件和服务的先导,是全球领先的质量管理和六西格玛实施软件工具及持续质量改进的良好工具软件,她具有强大的功能和简易的可视化...

如何熟练使用SQL查询(如何熟练使用sql查询内容)

要熟练使用SQL查询(StructuredQueryLanguage),你需要系统地从语法入门,到实战练习,再到性能优化与多表查询的掌握。下面是一条循序渐进、实战驱动的学习路径:第一阶段:S...

SAP SE38如何在多个系统间同步代码

上一篇文章写了如何在多个系统之间同步开发对象:多套SAPERP之间一键同步ABAP开发内容,有兄弟问有没有简单办法同步SE38程序代码的,因为使用请求的方式同步代码有点小题大做了。...

Python | 垂直模态分解(phython垂直输出)

...

技术栈:刷了百道SQL题,还是不会用?你应该这样补短板

这是来自用户的提问,也是很多人遇到的困惑:...

mysql窗口函数为了解决更加复杂的问题

为了解决复杂问题的窗口函数我们先讲一下窗口函数是什么窗口和普通的函数作用相同在不同列上进行查询和返回比如我们有如下的表...

MariaDB开窗函数(开窗函数 mysql)

在使用GROUPBY子句时,总是需要将筛选的所有数据进行分组操作,它的分组作用域是整张表。分组以后,为每个组只返回一行。而使用基于窗口的操作,类似于分组,但却可以对这些"组"(即窗口...

一文掌握 DuckDB 时间序列分析:窗口函数实战详解

...

一篇文章搞定MySQL中的窗口函数(mysql常用的窗口函数)

我是孙斌,北理数学系毕业,分享数据分析相关知识,点击右上角“关注”,学习更多数据分析知识。在MySQL中,分组groupby一般和聚合函数连用,如groupby+sum,这样能够得到每个组的总和,...