- 使用最新版的 filepicker 库,必须使用最新版的xwidget库。都是 5.6.3 以上确保。
- 用了很多,都没有丝滑的选择效果的开源库,滑动选择丝滑。闲来没事,随手写一个吧。
- 图库选择,文件选择
- 仿华为相册滑动选择手势逻辑,
- 微信选择库样式风格
- 支持多选,限制数量,不限制数量。
- 使用场景,多用于 视频剪辑选择库,相册管理选择库。那去玩吧。
- 扫码:
- 或者:点击下载 app-debug.apk
- 下面的这个三方库,本maven仓库中的aar都过滤掉了。建议自己从下面引用,防止库冲突。
- **filepicker
**
- **xwidget
**
- **BRV
**
- **BasePopup
**
- androidx.media3 这里建议使用1.7.1
稳定版
- glide
dependencies {
// 基础组件库 (必须)
implementation("com.gitee.pichs:filepicker:5.9.0")
// 基础组件库 (必须)
implementation("com.gitee.pichs:xwidget:5.6.3")
// glide 图片加载 (必须)
implementation("com.github.bumptech.glide:glide:4.16.0")
//基础库(必须)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.activity.ktx)
implementation(libs.androidx.fragment.ktx)
implementation(libs.material)
implementation(libs.androidx.recyclerview)
implementation(libs.androidx.annotation)
implementation(libs.kotlinx.coroutines.android)
implementation(libs.kotlinx.coroutines.core)
// brv (必须)
implementation("com.github.liangjingkanji:BRV:1.6.1")
// 弹窗 (必须)
implementation("io.github.razerdp:BasePopup:3.2.1")
// 视频播放库 (必须)采用exoplayer
implementation("androidx.media3:media3-exoplayer:1.7.1")
implementation("androidx.media3:media3-ui:1.7.1")
}
使用libs.version.toml用户引入方式
dependencies {
api(libs.filepicker)
api(libs.xwidget)
api(libs.glide)
api(libs.brv)
api(libs.basepopup)
api(libs.media3.exoplayer)
api(libs.media3.ui)
}
# libs.version.toml中写法
[versions]
xwidget = "5.6.3"
filepicker = "5.9.0"
brv = "1.6.1"
basepopup = "3.2.1"
glide = "4.16.0"
activityKtx = "1.9.0"
fragmentKtx = "1.6.2"
recyclerview = "1.4.0"
kotlinxCoroutinesAndroid = "1.7.3"
kotlinxCoroutinesCore = "1.7.3"
media3Exoplayer = "1.7.1"
[libraries]
androidx-media3-exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3Exoplayer" }
androidx-media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3Exoplayer" }
androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activityKtx" }
androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" }
androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" }
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutinesAndroid" }
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutinesCore" }
xwidget = { group = "com.gitee.pichs", name = "xwidget", version.ref = "xwidget" }
filepicker = { group = "com.gitee.pichs", name = "filepicker", version.ref = "filepicker" }
basepopup = { group = "io.github.razerdp", name = "BasePopup", version.ref = "basepopup" }
brv = { group = "com.github.liangjingkanji", name = "BRV", version.ref = "brv" }
glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" }
FilePicker
是一个支持图片、视频、文件选择的轻量级文件选择器,支持自定义配置、选中列表管理、回调返回选中数据。
- 支持 Activity 和 Fragment 调用
- 支持多选、最大数量控制、文件大小限制
- 支持返回原图选项
- 支持 UI 文案与界面定制
- 支持滑动选择
- 支持单选立即返回
- 支持预选列表
FilePicker.with(this) // this: FragmentActivity
.setSelectType(FilePicker.ofImage()) // 设置选择类型
.setMaxSelectNumber(9) // 设置最大选择数量
.setSlideChooseEnable(true) // 开启滑动选择
.setOnSelectCallback(object : OnSelectCallback {
override fun onSelectedCallback(isUseOriginal: Boolean, list: MutableList<MediaEntity>) {
// 选择完成回调
println("是否使用原图: $isUseOriginal")
list.forEach {
println("文件路径: ${it.path}")
}
}
override fun onCancel() {
// 取消选择
}
})
.setUiConfig(
FilePickerUIConfig(
isHideSelectTab = false,
allAlbumName = "全部",
confirmBtnText = "发送",
isShowOriginal = false,
isPreviewPageIndexMode = true,
isShowSelectedListDeleteIcon = true,
folderNickNameMap = hashMapOf(
"DCIM" to "相册"
)
)
).
.start()
FilePicker.with(this) // this: Fragment
.setSelectType(FilePicker.ofImage())
.setMaxSelectNumber(5)
.setMaxFileSize(50 * 1024 * 1024) // 50MB
.setMinFileSize(1 * 1024) // 1KB
.setOnSelectCallback { isUseOriginal, list ->
// 选择完成回调
}
.setUiConfig(
FilePickerUIConfig(
isHideSelectTab = true,
allAlbumName = "全部",
confirmBtnText = "下一步",
isShowOriginal = false,
isPreviewPageIndexMode = true,
isShowSelectedListDeleteIcon = true,
folderNickNameMap = hashMapOf(
"DICM" to "相机",
"Download" to "下载"
)
)
).
.start()
方法名 | 描述 |
---|---|
with(activity) |
使用 FragmentActivity 初始化 |
with(fragment) |
使用 Fragment 初始化 |
ofImage() |
只选择图片 |
ofVideo() |
只选择视频 |
ofAll() |
选择图片和视频 |
ofAllWithGif() |
选择图片、视频和GIF |
ofGif() |
只选择GIF |
ofAudio() |
只选择音频 |
ofDocument() |
选择所有文档类型 |
ofPdf() |
只选择PDF |
ofDoc() |
只选择DOC和DOCX |
ofPpt() |
只选择PPT和PPTX |
ofExcel() |
只选择XLS和XLSX |
ofTxt() |
只选择TXT |
ofApk() |
只选择APK |
ofZipAll() |
选择所有压缩包类型 |
ofZip() |
只选择ZIP |
ofRar() |
只选择RAR |
of7Z() |
只选择7Z |
ofTar() |
只选择TAR |
ofGz() |
只选择GZ |
ofBz2() |
只选择BZ2 |
ofIso() |
只选择ISO |
convertToPathList(list) |
将 MediaEntity 列表转换为路径列表 |
convertToEntityList(list) |
将路径列表转换为 MediaEntity 列表 |
方法名 | 描述 |
---|---|
setSelectType(type) |
设置选择的文件类型 |
setMaxSelectNumber(num) |
设置最大选择数量 |
setMaxFileSize(size) |
设置最大文件大小(字节) |
setMinFileSize(size) |
设置最小文件大小(字节) |
setSlideChooseEnable(enable) |
是否启用滑动选择,默认 true |
setSingleClickEnable(enable) |
是否启用单选立即返回,默认 false 。仅在 maxSelectNumber 为1时生效 |
setSelectedList(list) |
设置已选中的 MediaEntity 列表 |
setSelectedPathList(list) |
设置已选中的文件路径列表 |
setUiConfig(config) |
设置自定义UI配置 |
setOnSelectCallback(callback) |
设置选择结果回调 |
start() |
启动选择器 |
通过 FilePicker.with(this).setUiConfig(uiConfig)
进行设置。
val uiConfig = FilePickerUIConfig().apply {
isHideSelectTab = false
confirmBtnText = "完成"
allAlbumName = "所有文件"
// ... 更多配置
}
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
isHideSelectTab |
Boolean |
是否隐藏顶部分类Tab | false |
confirmBtnText |
String |
确定按钮的文本 | "确定" |
isPreviewPageIndexMode |
Boolean |
预览页面是否显示页码 | true |
allAlbumName |
String |
“全部”文件夹的显示名称 | "全部" |
previewText |
String |
预览页面的标题 | "预览" |
isShowBottomPreviewText |
Boolean |
是否显示底部预览按钮 | true |
previewSelectText |
String |
预览页面底部“选择”按钮文本 | "选择" |
originalText |
String |
“原图”选项的文本 | "原图" |
isShowOriginal |
Boolean |
是否显示“原图”选项 | true |
isOriginalChecked |
Boolean |
“原图”选项是否默认选中 | false |
isShowHomePageSelectedBottomListWidget |
Boolean |
是否显示主页底部已选列表 | true |
isShowSelectedListDeleteIcon |
Boolean |
是否显示已选列表项的删除按钮 | false |
selectedListDeleteIconResId |
Int |
已选列表项删除按钮的图标资源ID | 0 |
selectedListDeleteIconBackgroundColor |
Int |
已选列表项删除按钮的背景色 | Color.TRANSPARENT |
atLeastSelectOneToastContent |
String |
未选择任何文件时的提示 | "至少选择一个" |
selectMaxNumberOverToastContent |
String |
超出最大选择数量时的提示 | "已达到最大选择数量" |
folderNickNameMap |
HashMap<String, String> |
文件夹名称映射,用于自定义显示名称 | emptyHashMap() |
## !!!温馨提示: 如果UI效果与你的需求差距较大,强烈建议下载源码,自己修改一下。fork代码,自己改。!!!
FilePicker
旨在提供简洁、灵活、可定制的文件选择功能,广泛适用于相册、文件管理、视频选择等场景。
如需深入定制或遇到问题,欢迎补充需求,我可以帮您生成对应的开发指导。
本项目在开发过程中参考和使用了以下优秀的开源项目,特此致谢:
- xwidget - 提供了超级方便的基础组件。
- BRV —— 便捷的 RecyclerView 适配器库
- BasePopup —— 强大的弹窗库
- Glide —— 高效的图片加载库
- androidx.media3 —— 官方视频播放组件
感谢你们的无私奉献,让开发变得更加高效和有趣!
- 解决选择图片过多,intent超过1M的问题。随便选无上限
- 优化index数字过大展示不全的问题。目前支持到 99999 张
- 增加文件夹别名设置setUiConfig中folderNickNameMap里自行添加,默认不添加。也可做翻译文件夹用。仅文件夹哦。
- 其他的UI上的文字都在FilePickerUIConfig中有对应属性,请仔细查看文档。
- 修复最后一行选中图片被遮挡的问题
- 优化放大图标,更好看了。
- 优化过多图片首屏展示慢的问题。
- 修复音频播放放到后台还在继续的问题。
- 剔除日志影响
- 新版UI 点击更丝滑
- 适配底部小横导航栏
- 优化UI选择样式
- 新增:支持更多文件类型选择,如文档(audio, pdf, doc, ppt, excel, txt)、APK、各类压缩包等。
- 新增:
setSingleClickEnable(boolean)
API,支持单选模式下单击立即返回。 - 新增:
setSlideChooseEnable(boolean)
API,可禁用滑动选择手势。 - 新增:
FilePickerUIConfig
中增加isHideSelectTab
、allAlbumName
、isShowBottomPreviewText
等UI配置项。
- 修复maxFileSize默认值:目前改为Long.MAX_VALUE .
- 适配手机底部导航栏,为屏幕内虚拟三键的情况。