下面给出实现效果图:
扫描手机图库中的图片方法
/**
* 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中
*/
private void getImages() {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show();
return;
}
// 显示进度条
mProgressDialog = ProgressDialog.show(this, null, "正在加载...");
new Thread(new Runnable() {
@Override
public void run() {
// 加载图片
Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
ContentResolver mContentResolver = ImageGalleryActivity.this
.getContentResolver();
// 只查询jpeg和png的图片
Cursor mCursor = mContentResolver.query(mImageUri, null,
MediaStore.Images.Media.MIME_TYPE + "=? or "
+ MediaStore.Images.Media.MIME_TYPE + "=?",
new String[] { "image/jpeg", "image/png" },
MediaStore.Images.Media.DATE_MODIFIED);
while (mCursor.moveToNext()) {
// 获取图片的路径
String path = mCursor.getString(mCursor
.getColumnIndex(MediaStore.Images.Media.DATA));
File file=new File(path);
GridChildImageBean bean=new GridChildImageBean();
bean.setImagePath(path);
bean.setImageName(file.getName());
bean.setImageSize(file.length()+"");
// 获取该图片的父路径名
String parentName = file.getParentFile()
.getName();
// 根据父路径名将图片放入到mGruopMap中
if (!mGruopMap.containsKey(parentName)) {
List<GridChildImageBean> chileList = new ArrayList<GridChildImageBean>();
chileList.add(bean);
mGruopMap.put(parentName, chileList);
} else {
mGruopMap.get(parentName).add(bean);
}
}
mCursor.close();
// 通知Handler扫描图片完成
mHandler.sendEmptyMessage(SCAN_OK);
}
}).start();
}
图库文件夹显示图片采用的是gridview,下面封装gridview的数据源
/**
* 组装分组界面GridView的数据源,因为我们扫描手机的时候将图片信息放在HashMap中 所以需要遍历HashMap将数据组装成List
*
* @param mGruopMap
* @return
*/
private List<GridImageBean> subGroupOfImage(HashMap<String, List<GridChildImageBean>> mGruopMap) {
if (mGruopMap.size() == 0) {
return null;
}
// 存放所有数据
List<GridImageBean> list = new ArrayList<GridImageBean>();
Iterator<Map.Entry<String, List<GridChildImageBean>>> it = mGruopMap.entrySet()
.iterator();
while (it.hasNext()) {
Map.Entry<String, List<GridChildImageBean>> entry = it.next();
GridImageBean mImageBean = new GridImageBean();
String key = entry.getKey();
List<GridChildImageBean> value = entry.getValue();
mImageBean.setFolderName(key);
mImageBean.setImageCounts(value.size());
mImageBean.setTopImagePath(value.get(0).getImagePath());// 获取该组的第1张图片
list.add(mImageBean);
}
return list;
}
图片显示的适配器
import gallery.GridImageView.OnMeasureListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.yuzhuo.imageselectdemo.R;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Point;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;
import android.widget.CompoundButton.OnCheckedChangeListener;
/**
* 单张图片选择适配器
*
* @author zhy
*
*/
public class ImageGalleyAdapter extends BaseAdapter {
/**
* 用来保存ImageView的宽和高
*/
private Point mPoint = new Point(0, 0);
/**
* 用来存储图片的选中情况
*/
private HashMap<Integer, GridChildImageBean> mSelectMap = new HashMap<Integer, GridChildImageBean>();
private List<GridChildImageBean> list;
protected LayoutInflater mInflater;
private Context context;
private int picNums;
public ImageGalleyAdapter(Context context, List<GridChildImageBean> list,
int picNums) {
this.context = context;
this.list = list;
this.picNums = picNums;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final GridChildImageBean bean = list.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_gallery_child, null);
viewHolder = new ViewHolder();
viewHolder.mImageView = (GridImageView) convertView
.findViewById(R.id.ac_gallery_child_image);
viewHolder.mCheckBox = (CheckBox) convertView
.findViewById(R.id.ac_gallery_child_checkbox);
// 用来监听ImageView的宽和高
viewHolder.mImageView.setOnMeasureListener(new OnMeasureListener() {
@Override
public void onMeasureSize(int width, int height) {
mPoint.set(width, height);
}
});
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.mImageView
.setImageResource(R.drawable.gallery_albums_no_find);
}
viewHolder.mCheckBox.setOnCheckedChangeListener(null);
// 初始化样式
viewHolder.mCheckBox
.setChecked(mSelectMap.containsKey(position) ? mSelectMap.get(
position).getSelected() : false);
// 添加选择监听器
viewHolder.mCheckBox
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
if (mSelectMap.size() > (picNums - 1)) {
viewHolder.mCheckBox.setChecked(false);
isChecked = false;
// addAnimation(viewHolder.mCheckBox);
bean.setSelected(false);// 设置选中
Toast.makeText(context, "亲,您最多选择" + picNums
+ "张照片噢!", 1000).show();
} else {
// 如果是未选中的CheckBox,则添加动画
if (!mSelectMap.containsKey(position)
|| (mSelectMap.get(position) != null && !mSelectMap
.get(position).getSelected())) {
addAnimation(viewHolder.mCheckBox);
}
bean.setSelected(true);// 设置选中
mSelectMap.put(position, bean);
}
} else {
mSelectMap.remove(position);
}
}
});
if (position == 0) {
viewHolder.mImageView
.setImageResource(R.drawable.actionbar_camera_icon);
viewHolder.mCheckBox.setVisibility(View.GONE);
} else {
// 利用NativeImageLoader类加载本地图片
NetConfig.getInstance().displayImage(
"file://" + bean.getImagePath(), viewHolder.mImageView);
viewHolder.mCheckBox.setVisibility(View.VISIBLE);
}
return convertView;
}
/**
* 给CheckBox加点击动画,利用开源库nineoldandroids设置动画
*
* @param view
*/
private void addAnimation(View view) {
float[] vaules = new float[] { 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f,
1.1f, 1.2f, 1.3f, 1.25f, 1.2f, 1.15f, 1.1f, 1.0f };
AnimatorSet set = new AnimatorSet();
set.playTogether(ObjectAnimator.ofFloat(view, "scaleX", vaules),
ObjectAnimator.ofFloat(view, "scaleY", vaules));
set.setDuration(150);
set.start();
}
/**
* 获取选中的Item的路径
*
* @return
*/
public List<String> getSelectItems() {
List<String> list = new ArrayList<String>();
for (Iterator<Map.Entry<Integer, GridChildImageBean>> it = mSelectMap
.entrySet().iterator(); it.hasNext();) {
Map.Entry<Integer, GridChildImageBean> entry = it.next();
if (entry.getValue().getSelected()) {
list.add(entry.getValue().getImagePath());
}
}
return list;
}
/**
* 获取选中的Item全部对象
*
* @return
*/
public List<GridChildImageBean> getSelectItemsAll() {
List<GridChildImageBean> list = new ArrayList<GridChildImageBean>();
for (Iterator<Map.Entry<Integer, GridChildImageBean>> it = mSelectMap
.entrySet().iterator(); it.hasNext();) {
Map.Entry<Integer, GridChildImageBean> entry = it.next();
if (entry.getValue().getSelected()) {
list.add(entry.getValue());
}
}
return list;
}
public static class ViewHolder {
public GridImageView mImageView;
public CheckBox mCheckBox;
}
}
实现的Demo这个网址http://download.csdn.net/detail/zhuod/9487132 点击打开链接
本文介绍了如何实现自定义相册功能,能够从系统图库中扫描并选择多张图片,同时具备数量限制的特性。提供实现效果的截图以及关键步骤,包括扫描图库的方法和图片显示的适配器详细说明。

2178

被折叠的 条评论
为什么被折叠?



