漂亮的图片多选控件
对比了很多图片多选的控件,感觉都不太适合自己,灵活度较低,往往需要对源码做大量的修改,自己对其进行了简单的实现,来更好的适应多变的环境,本文暂时不讲原理和实现,之后会详细讲解,首先来讲解一下控件的使用。
Gradle
repositories {
maven { url "https://jitpack.io" }
}
dependencies {
compile 'com.github.sd6352051:android-image-picker:v1.0.1'
}
如何使用
Step 0: 添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Step 2: 添加控件的根布局
提供一个ViewGroup id 可以随意定义,之后绑定时需要用到
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/gallery_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
Step 3: 在你的activity中调用此方法attachFragment(R.id.gallery_root)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
attachFragment(R.id.gallery_root);
}
Step 4: 实现接口
@Override
public Configuration getConfiguration() {
//返回控件配置
Configuration cfg=new Configuration.Builder()
.build();
return cfg;
}
@Override
public List<PhotoEntry> getSelectPhotos() {
//返回当前已经选中的图片 没有是返回null
return mSelectedPhotos;
}
@Override
public void onSelectedCountChanged(int count) {
//这个方法将在你图选择发生变化时调用
// count:当前被选中图像数量
}
@Override
public void onAlbumChanged(String name) {
//这个方法将在相册选择发生变化时调用
//name:当前选中的相册名称
}
@Override
public void onTakePhoto(PhotoEntry entry) {
//这个方法将在你拍照后调用
//entry:返回拍照后的图片信息
}
@Override
public void onChoosePhotos(List<PhotoEntry> entries) {
//这个方法将在你调用 sendPhotos() 方法后调用
//entries:返回你选中的图片信息
}
@Override
public void onPhotoClick(PhotoEntry entry) {
//这个方法将在你点击图像时调用,如果configuration hasPreview(false)时 将不回调此方法
//entry: 返回当前点击的图像信息
}
Step 5: 其他方法
openAlbum()
: 打开相册弹窗
sendPhotos()
: 这个方法将会被调用 onChoosePhotos(List<PhotoEntry> entries)
配置项
默认配置
Configuration cfg=new Configuration.Builder()
//是否包含相机按钮
.hasCamera(true)
//图片选中后是否包含一个浮层
.hasShade(true)
//是否包含图像预览功能,为false时点击图像将执行反选效果,true则会调用onPhotoClick方法
.hasPreview(true)
//GridView间隔
.setSpaceSize(4)
//图像最大宽度
.setPhotoMaxWidth(120)
//Checkbox 背景色
.setCheckBoxColor(0xFF3F51B5)
//相册弹出默认高度
.setDialogHeight(Configuration.DIALOG_HALF)
//相册模式 DIALOG_GRID 网格形式 DIALOG_LIST 列表形式
.setDialogMode(Configuration.DIALOG_GRID)
//图像最大选中
.setMaximum(9)
//图像达到最大选中时的提示
.setTip(null)
//相册标题
.setAblumsTitle(null)
.build();
详细
该控件只提供了基础的图片多选功能,我可以在自己的activity
中通过attachFragment(R.id.gallery_root);
来完成绑定 即可显示图片选择控件,
通过调用openAlbum()
方法来打开相册,通过我们实现的一系列回调方法来获取需要的大多数据,当图片选择完成后调用sendPhotos()
方法即可在onChoosePhotos
方法中获取到我们选择的详细图片信息,获取到需要的数据后即可通过 activity
的 onActivityResult
或者 eventbus
及类似控件来传递数据 ,下面介绍一下实现的回调接口的作用。
- 1
getConfiguration
: 获取配置信息,可以高度的定义控件的属性,上面有详细讲到每个属性的作用。 - 2
getSelectPhotos
: 当前已经选中的图片,例如我们第一次选择了3张,但我们还要继续选择,下次选择就需要携带上一次选中的3张图片的信息。 - 3
onSelectedCountChanged
:当被选中的图像数量发生改变将调用此方法,大部分情况我们的界面上可能需要显示当前选中的数量,可以在此做跟新 - 4
onAlbumChanged
: 当相册名称发生变化将调用次方法,如果你的界面需要此信息,可以在此获取 - 5
onTakePhoto
: 当拍照完成后会调用次方法,可以在此获取的刚拍的照片信息,例如我们通常会在此关闭当前activiy,传递图像信息等。 - 6
onChoosePhotos
:此回调需要手动调用sendPhotos
触发,将得到当前选中的所有图片信息,例如通常会在此关闭当前图片选中activity,传递信息到需要的地方 - 7
onPhotoClick
:此回调会受 配置项中hasPreview 影响,为false时将不执行此回调,通常我们会增加图片的浏览功能可以使用photoview
或其他控件,当点击图像,就可以在此接口中获取点击图像的信息。
可以通过配置项来充分的达到理想的效果,例如通过setDialogMode(Configuration.DIALOG_GRID or Configuration.DIALOG_LIST)
来改变相册集的布局方式
Github 欢迎 star follow