自定义相册多张图片选择并可限制数量

本文介绍了如何实现自定义相册功能,能够从系统图库中扫描并选择多张图片,同时具备数量限制的特性。提供实现效果的截图以及关键步骤,包括扫描图库的方法和图片显示的适配器详细说明。

下面给出实现效果图:

扫描手机图库中的图片方法

/**
	 * 利用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 点击打开链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值