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

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支持下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值