前言
相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了。所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件。
•支持自定义选择图片的样式
•支持设置图片选择数量
•支持图片预览,删除
•支持图片拍照
先来看看效果
实现分析
假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行GridView的数据刷新。我们把这些逻辑写在我们自定义的GridView中,就成了一个新的控件。
1、GridView的效果展示,逻辑实现。
public class ImagePickerView extends GridView{
//图片选择数量
int maxImageSize = 9;
//添加item布局
private int noImgResource;
//列选择数量
private int columnNumber = 3;
Activity context;
ImagesAdapter adapter;
List imageList;//图片选择list
private static final int TYPE_SHOW_ADD = 0;
private static final int TYPE_NO_SHOW_ADD = 1;
private boolean isShowAdd = true;
int imageGridSize;
public void setNoImgResource(int noImgResource) {
this.noImgResource = noImgResource;
}
public void setColumnNumber(int columnNumber) {
if (columnNumber>5){
columnNumber = 5;
}
this.columnNumber = columnNumber;
this.setNumColumns(columnNumber);
}
public void setShowAdd(boolean showAdd) {
isShowAdd = showAdd;
}
public void setImageList(List imageList) {
this.imageList = imageList;
adapter.setImageList(imageList);
}
public List getImageList() {
return imageList;
}
public ImagePickerView(Context context) {
this(context,null);
}
public ImagePickerView(Context context, AttributeSet attrs) {
this(context,attrs,0);
}
/**
* 初始化ImagePickerView的一些信息
* @param context
* @param attrs
* @param defStyle
*/
public ImagePickerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = (Activity) context;
adapter = new ImagesAdapter();
this.setAdapter(adapter);
if (imageList==null){
imageList = new ArrayList<>();
}
this.setNumColumns(columnNumber);
this.setVerticalSpacing(10);
this.setHorizontalSpacing(10);
imageGridSize = (this.context.getWindowManager().getDefaultDisplay().getWidth() - Util.dp2px(context, 2) * 2) / columnNumber;
}
/**
* 提供给外部调用用来再Activity返回时获取图片信息
* @param requestCode
* @param resultCode
* @param data
*/
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data!=null&& !TextUtils.isEmpty(data.getStringExtra("photoPath"))){//拍照
imageList.add(data.getStringExtra("photoPath"));
}else if (data!=null&&data.getSerializableExtra("images")!=null){//图片选择
imageList = (List) data.getSerializableExtra("images");
}else{
List list = AndroidIm