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

来源:互联网 发布:淘宝扣12分有什么影响 编辑:程序博客网 时间:2024/04/28 17:13

下面给出实现效果图:

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

/** * 利用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() {@Overridepublic 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);}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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点击打开链接



0 0
原创粉丝点击