最全面的仿微信同时添加多张图片 你值得拥有!
github地址:https://github.com/iicee/iicecream_multiple_images_selector_master
项目描述:通过多选的方式同时添加多张图片,支持图片缩放切换预览,支持删除选择中状态的图片,支持在相册分类中显示勾选中的图片,支持拍照上传。很适合你在项目中需要到的添加图片、绽放预、 选中打勾。
图片展示:
实现过程:
- 遍历本机所有图片并保存进集合列表
Cursor mCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.ImageColumns.DATA}, "", null,
MediaStore.MediaColumns.DATE_ADDED + " DESC");
imageTopFolder = new ImageFolder();
imageTopFolder.setDir("/所有图片");
mDirPaths.add(imageTopFolder);//手动添加文件夹第一项 所有图片
if (mCursor.moveToFirst()) {
LogUtils.e(mCursor.getCount() + "");
int _date = mCursor.getColumnIndex(MediaStore.Images.Media.DATA);
LogUtils.e("-date=" + _date);
int i = 0;
do {
i++;
// 获取图片的路径
//如:/storage/emulated/0/Download/1487055003055.jpg
String path = mCursor.getString(_date);
if (i == 1) {
imageTopFolder.setFirstImagePath(path);//设置首张图片路径
}
// LogUtils.e("-path="+path);
// 获取该图片的父路径名
File parentFile = new File(path).getParentFile();
if (parentFile == null) {
continue;
}
ImageFolder imageFolder;
//文件夹 完整路径
String dirPath = parentFile.getAbsolutePath();
// LogUtils.e("-dirPath=" + dirPath);
if (!tmpDir.containsKey(dirPath)) {
// 初始化imageFolder
imageFolder = new ImageFolder();//除第一个(所有图片的文件夹)分类的文件夹
imageFolder.setDir(dirPath);//设置文件夹路径
imageFolder.setFirstImagePath(path);//设置首张图片路径
mDirPaths.add(imageFolder);//把文件夹添加进列表里
//一个文件夹完整路径对应一个文件夹的索引
tmpDir.put(dirPath, mDirPaths.indexOf(imageFolder));//集合添加一个文件夹
} else {
//已经存在了这个文件夹 就从列表根据所索获取对象
imageFolder = mDirPaths.get(tmpDir.get(dirPath));//表示同一个文件夹
}
//设置文件夹选中的图片的个数
// LogUtils.e("文件夹名:"+dirPath);
if (BaseApplication.getInstance().checkedList != null && !BaseApplication.getInstance().checkedList.isEmpty()) {
if (BaseApplication.getInstance().checkedList.contains(path)) {
imageFolder.setCheckCounts(imageFolder.getCheckedCounts()+1);
// LogUtils.e(dirPath+"-imageFolder.getCheckedCounts()+1="+(imageFolder.getCheckedCounts()+1));
}else{
// LogUtils.e(dirPath+"-没有选择中");
}
}
imageFolder.images.add(new ImageDto(path));//一个文件夹图片列表添加多张图片
imageTopFolder.images.add(new ImageDto(path));//显示所有图片的文件夹:添加所有图片
} while (mCursor.moveToNext());
// LogUtils.e("i=" + i);
}
mCursor.close();
imageTopFolder.setCheckCounts(BaseApplication.getInstance().checkedList.size());//所有图片文件夹中所有选中图片的个数
ListView lv_data = (ListView) findViewById(R.id.lv_data);
ImageFolderAdapter adapter = new ImageFolderAdapter(this, mDirPaths);
lv_data.setAdapter(adapter);
2.自定义gridview图片显示
//folder:文件夹 为空显示全部图片 camera:显示拍照的图片
ImageFolder imageFolder = (ImageFolder) getIntent().getSerializableExtra("folder");
if (imageFolder == null) {//扫描没有图片
Cursor mCursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.ImageColumns.DATA}, "", null,
MediaStore.MediaColumns.DATE_ADDED + " DESC");
imageFolder = new ImageFolder();
imageFolder.setDir("/所有图片");
if (mCursor.moveToFirst()) {
// LogUtils.e(mCursor.getCount() + "");
int _date = mCursor.getColumnIndex(MediaStore.Images.Media.DATA);
LogUtils.e("-date=" + _date);
do {
// 获取图片的路径
//如:/storage/emulated/0/Download/1487055003055.jpg
String path = mCursor.getString(_date);
imageItem = new ImageDto(path);
//设置列表 有就打勾
if (BaseApplication.getInstance().checkedList != null && !BaseApplication.getInstance().checkedList.isEmpty()) {
imageItem.setChecked(BaseApplication.getInstance().checkedList.contains(path));
}
imageFolder.images.add(imageItem);//一个文件夹图片列表添加多张图片
} while (mCursor.moveToNext());
}
mCursor.close();
}//扫描结束
//原imageFolder is null ?(则扫描所有图片 重新赋值):(从传递过来的数据直接赋值)
images = imageFolder.images;
adapter = new ImageListAdapter(this, images);
gridview.setAdapter(adapter);
3.在onActivityResult处理添加图片的变化
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 拍照
if (resultCode == RESULT_OK && requestCode == 800) {
// 设置文件保存路径
String name = gridAdapter.getPicName();
if (!TextUtils.isEmpty(name)) {
LogUtils.e("图片", name);
} else {
LogUtils.e("AB");
}
File picture = new File(ImageUtils.getCameraPath(), name + ".jpg");
if (picture != null) {
String cameraPath = Uri.fromFile(picture).getPath();
LogUtils.e(cameraPath);
dataList.add(cameraPath);
BaseApplication.getInstance().checkedList.add(cameraPath);//添加到全局变量
gridAdapter.notifyDataSetChanged();
}
}
if (data == null) return;
if (resultCode == RESULT_OK && requestCode == 600) {
if (BaseApplication.getInstance().checkedList != null
&& !BaseApplication.getInstance().checkedList.isEmpty()) {
dataList.clear();
dataList.addAll(BaseApplication.getInstance().checkedList);
gridAdapter.notifyDataSetChanged();
}
}
}
4.在application中设置最多添加图片的个数
public ArrayList<String> checkedList = new ArrayList<>();//选中的图片列表
public int default_checked_counts = 5;//默认最多能选中图片的个数
public void setDefault_checked_counts(int default_checked_counts) {
this.default_checked_counts = default_checked_counts;
}
public boolean isCheckedMax() {//选择够5张图片了
if (default_checked_counts > checkedList.size()) {
return false;
}
return true;
}
项目总结
仿微信添加图片多功能这个项目非常全面,项目用到技术的关键点有定义一个存储图片对象的集合,以文件夹为一个单元存储并用到了HashMap映射一对多的关系。感谢你的预览 有不足之处欢迎指出,谢谢!!