一步一步的写自己的相册

本文介绍如何使用imageLoader开源库创建自定义相册。首先,需要引入jar包并添加访问权限。接着,获取相册及图片信息,用数组存储。在适配器中布局相册。当查看特定相册时,通过全局变量传递相册号。最后,预览选中图片,显示在ViewPager中。文章展示了不同阶段的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这,我使用了开源项目imageLoader来加载显示大量图片,关于该开源项目的使用,你可以参考下我的上两篇博文,这里主要是写自定义相册的流程。


开始之前我们必须做的准备:

        1.引入开源项目的jar。

        2.清单文件中添加访问权限:

  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


获取包含图片的文件夹信息:

       1.图片信息数组:包含了图片的基本信息。

	/*
	 * 获取图片的字段信息
	 */
	static final String[] STORE_IMAGES = {
			MediaStore.Images.Media.DISPLAY_NAME, // 名称
			MediaStore.Images.Media.DATA, MediaStore.Images.Media.LONGITUDE, // 经度
			MediaStore.Images.Media._ID, // id
			MediaStore.Images.Media.BUCKET_ID, // dir id 目录
			MediaStore.Images.Media.BUCKET_DISPLAY_NAME // dir name 目录名字
	};
        2.获取相册:通过数据库,获取包含图片的游标。

/*
	 * 按相册获取图片信息
	 */
	static List<PhotoAibum> getPhotoAlbum(Context context) {
		List<PhotoAibum> aibumList = new ArrayList<PhotoAibum>();
		Cursor cursor = MediaStore.Images.Media.query(
				context.getContentResolver(),
				MediaStore.Images.Media.EXTERNAL_CONTENT_URI, STORE_IMAGES);
		Map<String, PhotoAibum> countMap = new HashMap<String, PhotoAibum>();
		PhotoAibum pa = null;
		while (cursor.moveToNext()) {
			String path = cursor.getString(1);
			String id = cursor.getString(3);
			String dir_id = cursor.getString(4);
			String dir = cursor.getString(5);
			if (!countMap.containsKey(dir_id)) {
				pa = new PhotoAibum();
				pa.setName(dir);
				pa.setBitmap(Integer.parseInt(id));
				pa.setCount("1");
				pa.getBitList().add(new PhotoItem(Integer.valueOf(id), path));
				countMap.put(dir_id, pa);
			} else {
				pa = countMap.get(dir_id);
				pa.setCount(String.valueOf(Integer.parseInt(pa.getCount()) + 1));
				pa.getBitList().add(new PhotoItem(Integer.valueOf(id), path));
			}
		}
		cursor.close();
		Iterable<String> it = countMap.keySet();
		for (String key : it) {
			aibumList.add(countMap.get(key));
		}
		return aibumList;
	}
          3.相册的属性:

public class PhotoAibum implements Serializable{
	private static final long serialVersionUID = 1L;
	private String name;   //相册名字
	private String count; //数量
	private int  bitmap;  // 相册第一张图片

通过以上的方法,我们就可以得到关于相册和图片的信息,然后在适配器中合理的布局自己的相册了。


查看某相册下的所有图片:

        1.由于传递List集合:你选中了想查看的相册时,需要告诉下一个活动你选中的是哪个相册。由于Intent传递的数据不易过多,我这里使用了全局变量,来存储选中的相册号。

static int NumberAlbum = 0;
        2.预览功能:给每个显示的图片添加一个标签,来显示是否被选中。选中的图片,将其地址存放到一个地址的集合中,传递给预览的界面。

// 查看集合是否包含该地址
				if (!clickList.contains(picturesList.get(position).getPath())) {
					cView.setBackgroundResource(R.drawable.cb_on);
					// 将地址添加到集合中
					clickList.add(picturesList.get(position).getPath());
				} else {
					cView.setBackgroundResource(R.drawable.cb_normal);
					// 移除添加过的地址
					clickList.remove(picturesList.get(position).getPath());
				}
由于动态加载的原因,当该视图被回收后,重新加载的时候,添加的标签就会被清除掉,我们需要在绘制视图的时候,判断该路径是否已经存放在选中地址的集合中。

	// 查看集合是否包含该地址
			if (clickList.contains(picturesList.get(position).getPath())) {
				holder.clickView.setBackgroundResource(R.drawable.cb_on);
			} else {
				holder.clickView.setBackgroundResource(R.drawable.cb_normal);
			}
			imageLoader.displayImage("file://"
					+ picturesList.get(position).getPath(), holder.imageView,
					options);


预览选中的图片:

        接受选中的图片地址,并将根据图片地址将图片显示在ViewPager中。

class VPagerAdap extends PagerAdapter {

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return picturesList.size();
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			// // TODO Auto-generated method stub
			View view = getLayoutInflater().inflate(R.layout.item_pager_img,
					null);
			ZoomImageView zoomImageView = (ZoomImageView) view
					.findViewById(R.id.zoom_image_view);
			// 添加缩放
			zoomImageView.setImageBitmap(imageLoader.loadImageSync("file://"
					+ picturesList.get(position), options));
			container.addView(view);
			return view;
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			View view = (View) object;
			container.removeView(view);
		}
	}

zoomImageView 是自定义的View,可以缩放图片。

       

        效果:

1.所有的相册:

2.查看某个相册下的所有图片:

3.预览选中的图片:

点击下载资源

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值