Android 图片、视频选择库 PVSelector
写在开始
去年在编写公司项目的时候,牵涉到图片选择的部分,UX“借鉴”了微信的相关UI,因为工期原因,没有时间雕琢一个比较精致的选择库,所幸的是刚好在github发现了一个类似的开源项目:PictureSelector,当时这个项目也是才提交未久,匆匆改掉了一些bug,当做module就直接使用了。到今年年初的时候,抽空将之进行了剥离,创建了开源项目PVSelector,故名思义就是:Picture&Video selector。并计划对项目进行优化。
无意冒犯PictureSelector的作者,但当时clone的代码确实可读性太糟糕,在修改bug时造成了很多麻烦。近期抽空对项目进行了优化,从命名、逻辑拆分、精简入手进行了风格和规范调整。并且添加了链式调用的API层,避免了使用Config模式的麻烦。
近期又关注了一下PictureSelector项目,半年来也做了很多更新。但在此也鞭策自己一下。
Feature 概览
图片
视频
- 单个、多个视频选择模式
- 预览
风格配置
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支持下。