[OpenSource] Android 图片、视频选择库 PVSelector

来源:互联网 发布:无经验美工如何面试 编辑:程序博客网 时间:2024/05/17 23:51

Android 图片、视频选择库 PVSelector

写在开始

去年在编写公司项目的时候,牵涉到图片选择的部分,UX“借鉴”了微信的相关UI,因为工期原因,没有时间雕琢一个比较精致的选择库,所幸的是刚好在github发现了一个类似的开源项目:PictureSelector,当时这个项目也是才提交未久,匆匆改掉了一些bug,当做module就直接使用了。到今年年初的时候,抽空将之进行了剥离,创建了开源项目PVSelector,故名思义就是:Picture&Video selector。并计划对项目进行优化。

无意冒犯PictureSelector的作者,但当时clone的代码确实可读性太糟糕,在修改bug时造成了很多麻烦。近期抽空对项目进行了优化,从命名、逻辑拆分、精简入手进行了风格和规范调整。并且添加了链式调用的API层,避免了使用Config模式的麻烦

近期又关注了一下PictureSelector项目,半年来也做了很多更新。但在此也鞭策自己一下。

Feature 概览

图片

  • 单图、多图选择模式
  • 即时拍照
  • 图片裁剪 使用开源项目UCrop
  • 图片压缩 可使用:
    • 系统bitmap的API进行压缩
    • 开源项目LuBan进行压缩
  • 图片预览,依赖[PhotoView]版本较旧

视频

  • 单个、多个视频选择模式
  • 预览

风格配置

QQ风格 or WeChat 风格
文字、配色的配置

集成

当前最新版本:
扩展的UCrop module:2.4.0
PVSelectorlib:1.1.0

编译包托管于JFog-JCenter

使用gradle引入依赖:

如果无法拉取到文件,显式的配置下仓库地址

allprojects {    repositories {        mavenCentral()        jcenter {            url "http://jcenter.bintray.com/"        }    }}

添加依赖,注意需要添加Glide

dependencies {       //...    compile 'individual.leobert.libs:pvselectorlib:1.1.0'    compile 'individual.leobert.libs:ucrop:2.4.0'    compile 'com.github.bumptech.glide:glide:3.7.0'}

使用

permission

 <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" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

manifest文件添加FileProvider配置 (适配Android 7.0 私有文件夹)

 <provider            android:name="android.support.v4.content.FileProvider"            android:authorities="${applicationId}.provider"            android:exported="false"            android:grantUriPermissions="true">            <meta-data                android:name="android.support.FILE_PROVIDER_PATHS"                android:resource="@xml/file_paths" />        </provider>

配置式使用参考sample
关键在于配置FunctionConfig
启动:

PictureConfig.init(config);                    PictureConfig.getPictureConfig().openPhoto(mContext, resultCallback);

链式调用:

//video PVSelector.getVideoSelector(this)     .multiSelect(4)     .enableCamera()     .enablePreview()                   .setCompleteTxtColor(ContextCompat.getColor(this,        R.color.colorPrimary))     .launch(resultCallback);//picture PVSelector.getPhotoSelector(this)                .singleSelect()                .enableCamera()                .enableCrop(FunctionConfig.CROP_MODE_16_9)                .useSystemCompress(true,true)                .setSelectedMedia(selectMedia) //已经选择的内容                .launch(resultCallback);

关于UI的配置,API 如下:

public interface ICustomStyle<T> {    /**     * @param spanCount 单行数量上限     */    T setImageSpanCount(int spanCount);    /**     * @param mainColor 主色 Context.getColor(resId)     */    T setThemeColor(@ColorInt int mainColor);    /**     * 设置选择图片页面底部背景色     *     * @param color     */    T setBottomBarBgColor(@ColorInt int color);    /**     * "预览"文字颜色     *     * @param color     */    T setPreviewTxtColor(@ColorInt int color);    /**     * “已完成”文字颜色     *     * @param color     */    T setCompleteTxtColor(@ColorInt int color);    /**     * 设置完成选取的文字     * @param completeText     */    T setCompleteText(CharSequence completeText);    /**     * 启用计数checkbox     */    T enableDisplayCandidateNo();    T setCheckedBoxDrawable(@DrawableRes int drawableResId);}

预览已经选择的图片,库中提供了简单实现:

 PictureConfig.getPictureConfig()                        .externalPicturePreview(mContext, position, selectMedia);

写在最后

截至1.1.0版本,代码中依旧存在着太多值得修改的内容,接下来还是先将这些代码进行修改(我是一个有代码洁癖[pi发第三声]的人),并对部分依赖库进行升级。然后再添加Friendly Functions以及扩展功能,如果支持Audio就要改名PVASelector啦。

项目遵守MIT,托管于github,再次给出传送门:click me,希望喜欢的朋友点个star支持下。

原创粉丝点击