自定义相册多张图片选择并可限制数量
来源:互联网 发布:淘宝扣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
- 自定义相册多张图片选择并可限制数量
- 从系统相册选择多张图片
- 从系统相册选择多张图片
- 从系统相册选择多张图片
- 从系统相册选择多张图片
- 从系统相册选择多张图片
- 从相册中选择多张图片
- ionic中实现从相册中选择图片并一次上传多张图片
- ios中调用相机,相册,选择多张图片
- ios 从系统相册选择多张图片
- iOS 自定义多张图片选择+demo
- TextView使用自定义HtmlHttpImageGetter实现异步加载网络图片,可限制加载图片数量
- 多张图片选择
- 仿QQ发表动态,获取系统相册,选择多张图片上传
- ios选择相册图片并保存
- Android从相册选择图片并裁剪
- Android开发选取相册多张图片
- Gallery+RecyclerView+Picasso实现从相册选取多张图片并展示
- composer安装使用
- Ajax 原理过程 同步异步区别 优缺点
- Dividing coins 动规
- Ranking Problem
- hdu 1312 搜索
- 自定义相册多张图片选择并可限制数量
- Linux远程下远程访问Mysql
- C/C++复习:点坐标(结构体)
- vs编译器重新生成解决方案问题
- In和Exist的效率问题
- 初见微服务之RESTful API
- 易语言学习第二十八课---结构和动态内存
- 在html中嵌入多媒体文件
- MachineLearning—Softmax Regression