PhotoPicker 是一个用 Kotlin 编写的轻量的 Android 图片选择器。
虽然 GitHub 上已经有很多图片选择器,比如 Album、Matisse、PickPhotoSample、RxGalleryFinal 等这些优秀的开源库。经调研这些库在多选模式下只支持指定最大可选数量,并不支持无上限的多选模式。通常这种模式的使用场景确实比较少,然而我司的一款产品就有用户反馈过这个需求。并且我司正在开发的一款产品中也需要这个功能,为了复用这个功能模块,我的 PhotoPicker 就应运而生了。
目前 PhotoPicker 还只是 alpha 版本,如果你有好的建议欢迎提 issue 和 pull request。
下载地址
Demo 截屏
Gradle
第一步:
添加下面的代码到根目录 build.gradle:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}第二步,添加依赖到你的项目中:
dependencies {
implementation 'com.github.Pigcasso:PhotoPicker:0.1.6-alpha'
}PhotoPicker 的使用方法包括:注册 Activity、单选模式、多选模式(设置上限)、多选模式(无上限)。
<activity android:name="io.zhuliang.photopicker.PhotoPickerActivity"/>
<!--如果开启预览功能,需要注册 PhotoViewActivity -->
<activity android:name="io.zhuliang.photopicker.PhotoViewActivity"/>// Kotlin
PhotoPicker
.image(this)
.singleChoice() // 单选模式
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start()
// Java
PhotoPicker
.Companion
.image(this)
.singleChoice() // 单选模式
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start()// Kotlin
PhotoPicker
.image(this)
.multipleChoice() // 多选模式
.upperLimit() // 设置上限
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.limitCount(limitCount) // 设置可选的上限数
.countable(countableCheck.isChecked)
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start()
// Java
PhotoPicker
.Companion
.image(this)
.multipleChoice() // 多选模式
.upperLimit() // 设置上限
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.limitCount(limitCount) // 设置可选的上限数
.countable(countableCheck.isChecked)
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start();// Kotlin
PhotoPicker
.image(this)
.multipleChoice() // 多选模式
.noUpperLimit() // 无上限
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.countable(countableCheck.isChecked) // 是否开启有序选择图片功能
.selectableAll(selectableAllCheck.isChecked) // 是否开启选择全部功能
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start()
// Java
PhotoPicker
.Companion
.image(this)
.multipleChoice() // 多选模式
.noUpperLimit() // 无上限
.allPhotosAlbum(allPhotosAlbumCheck.isChecked) // 是否显示所有图片相册
.preview(previewCheck.isChecked) // 是否开启预览功能
.countable(countableCheck.isChecked) // 是否开启有序选择图片功能
.selectableAll(selectableAllCheck.isChecked) // 是否开启选择全部功能
.onResult(result) // 选择完成后的回调
.onCancel(cancel) // 取消选择后的回调
.start();允许修改图片加载器和主题色
PhotoPicker 内置了一个简单的图片加载器 DefaultPhotoLoader。你也可以用Glide,Picasso等实现 。
请在项目中合适的位置(建议在 Application )修改图片加载库,以 Glide 为例:
Kotlin代码:
// 实现 PhotoLoader 接口
class GlidePhotoLoader : PhotoLoader {
override fun loadPhoto(imageView: ImageView, imagePath: String, viewWidth: Int, viewHeight: Int) {
Glide.with(imageView).load(imagePath).into(imageView)
}
}
class App : Application() {
override fun onCreate() {
super.onCreate()
// 修改图片加载库
PhotoPicker.photoLoader = GlidePhotoLoader()
}
}Java代码:
// 实现 PhotoLoader 接口
public class GlidePhotoLoader implements PhotoLoader {
@Override
public void loadPhoto(@NotNull ImageView imageView, @NotNull String imagePath, int viewWidth, int viewHeight) {
Glide.with(imageView).load(imagePath).into(imageView);
}
}
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
// 修改图片加载库
PhotoPicker.Companion.setPhotoLoader(new GlidePhotoLoader());
}
}请在项目中合适的位置(建议在Application中)修改主题色
// Kotlin
PhotoPicker.themeConfig = ThemeConfig()
.radioCheckedColor(Color.RED)
.bottomBarBackgroundColor(ContextCompat.getColor(this@App, R.color.colorPrimary))
.bottomBarTextColor(Color.MAGENTA)
.arrowDropColor(Color.CYAN)
.checkboxColor(ContextCompat.getColor(this@App, R.color.colorAccent))
.checkboxOutlineColor(ContextCompat.getColor(this@App, R.color.colorAccent))
.orderedCheckedBackground(R.drawable.ic_badge_checked_24dp)
.orderedUncheckedBackground(R.drawable.ic_badge_unchecked_24dp)
.actionBarBackground(ContextCompat.getColor(this@App, R.color.colorPrimary))
.statusBarColor(ContextCompat.getColor(this@App, R.color.colorPrimaryDark))
// Java
ThemeConfig themeConfig = new ThemeConfig()
.radioCheckedColor(Color.RED)
.bottomBarBackgroundColor(ContextCompat.getColor(this, R.color.colorPrimary))
.bottomBarTextColor(Color.MAGENTA)
.arrowDropColor(Color.CYAN)
.checkboxColor(ContextCompat.getColor(this, R.color.colorAccent))
.checkboxOutlineColor(ContextCompat.getColor(this, R.color.colorAccent));
PhotoPicker.Companion.setThemeConfig(themeConfig);主题色对应的位置
替换有序角标的背景需要定义 drawable 资源文件,默认的有序角标 drawable 资源文件如下:
<!--选中: ic_badge_checked_24dp.xml-->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="@dimen/badge_size_width"
android:height="@dimen/badge_size_height"/>
<corners android:radius="@dimen/badge_corners_radius"/>
<solid android:color="@android:color/holo_red_light"/>
<stroke
android:width="@dimen/badge_stroke_width"
android:color="@android:color/white"/>
</shape>
<!--未选中: ic_badge_unchecked_24dp.xml-->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="@dimen/badge_size_width"
android:height="@dimen/badge_size_height"/>
<corners android:radius="@dimen/badge_corners_radius"/>
<stroke
android:width="@dimen/badge_stroke_width"
android:color="@android:color/white"/>
</shape>-dontwarn zhuliang.photopicker.**
Copyright 2018 Picgasso
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.