Android之图片选择器

可以选择多张图片,对图片进行预览,预览时可以进行删除选中的图片 ,很不错的一个图片选择器。

至于图片如何上传,用什么网络框架,这里就不说了,你们自己决定怎么上传图片,可以选择表单上传的方式,也可以选择base64的方式上传,我这里写的是base64的方式上传,可自己进行调整。

注意:如果选择图片数量少的话,可以使用base64的方式上传,但是如果上传图片数量较多,建议使用表单上传的方式,不使用base64的方式。

项目下载链接会附在结尾,如有需要可以自行下载,如果有更好的方式欢迎大家一起交流。


主代码如下:

1.MainActivity

package com.pts.imagetestpic;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;

import com.pts.imagetestpic.adapter.MainGridAdapter;
import com.pts.imagetestpic.pic.Bimp;
import com.pts.imagetestpic.pic.FileUtils;
import com.pts.imagetestpic.utils.ImageHelper;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener {

	TextView mTxtBack;
	TextView mTxtTitle;
	TextView mTxtCommit;

	GridView mGridView; // 评论图片
	MainGridAdapter mGridAdapter;

	private List<String> mBase64; // base64集合
	private String mStrImageFile = "";
	private List<String> mImgPath; // 图片path

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		mBase64 = new ArrayList<String>();
		mImgPath = new ArrayList<String>();

		initView();
		initEvent();
	}

	private void initView() {
		mTxtBack = (TextView) findViewById(R.id.tv_back_top);
		mTxtBack.setVisibility(View.INVISIBLE);

		mTxtTitle = (TextView) findViewById(R.id.tv_title);
		mTxtTitle.setText("图片选择器");

		mTxtCommit = (TextView) findViewById(R.id.tv_right_title);
		mTxtCommit.setVisibility(View.VISIBLE);

		mGridView = (GridView) findViewById(R.id.grid_image_pic);
		mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
		mGridAdapter = new MainGridAdapter(this);
		mGridAdapter.update();
		mGridView.setAdapter(mGridAdapter);
	}

	private void initEvent() {
		mGridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				Intent intent = new Intent();
				if (position == Bimp.bmp.size()) {
					intent.setClass(MainActivity.this, AddPicActivity.class);
					startActivity(intent);
				} else {
					intent.setClass(MainActivity.this, PhotoActivity.class);
					intent.putExtra("ID", position);
					startActivity(intent);
				}
			}
		});
		mTxtCommit.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.tv_right_title:
			getPathList();
			if (mBase64.size() > 0) {
				getBase64();
			}
			break;

		default:
			break;
		}

	}

	@Override
	protected void onResume() {

		mGridAdapter.update();

		super.onResume();
	}

	public String getString(String s) {
		String path = null;
		if (s == null)
			return "";
		for (int i = s.length() - 1; i > 0; i++) {
			s.charAt(i);
		}
		return path;
	}

	// ----------------- 分割线 --------------------
	// ------处理上传服务器前的准备,我这里是将图片转车base64字符串,然后拼接成一个字符串提交给服务器

	/**
	 * 循环遍历生成base64字符串
	 */
	private void getPathList() {
		mBase64.clear();
		mStrImageFile = "";
		mImgPath = Bimp.drr;

		for (int i = 0; mImgPath != null && i < mImgPath.size(); i++) {
			uploadImage(mImgPath.get(i));
		}

	}

	/**
	 * 转成Base64字符串
	 * 
	 * @param path
	 */
	public void uploadImage(String path) {
		Bitmap bitmap = null;
		try {
			bitmap = ImageHelper.revitionImageSize(path, 600);
		} catch (IOException e) {
			e.printStackTrace();
		}
		String bm64 = ImageHelper.encodeBase64(bitmap);
		String data = "data:image/jpg;base64," + bm64;

		mBase64.add(data);
	}

	/**
	 * Base64 赋值
	 */
	private void getBase64() {
		JSONArray json = new JSONArray();
		for (int i = 0; i < mBase64.size(); i++) {
			String path = mBase64.get(i);
			json.put(path);
		}
		mStrImageFile = json.toString();
		System.out.println("=======" + mStrImageFile);
	}

	// ----------------- 分割线 --------------------

	@Override
	protected void onDestroy() {

		// 清除保存的图片等信息
		Bimp.bmp.clear();
		Bimp.drr.clear();
		Bimp.max = 0;
		Bimp.image_base64.clear();
		FileUtils.deleteDir();

		super.onDestroy();
	}

}
注意:对选择后的图片进行上传前的操作可在MainActivity里面进行,在提交的触发事件进行处理;也可以在选择图片的ImageGridActivity里面进行处理,可自行决定。


2.相册列表 AddPicActivity

public void initEvent() {
		mTxtBack.setOnClickListener(this);
		gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				/**
				 * 根据position参数,可以获得跟GridView的子View相绑定的实体类,然后根据它的isSelected状态,
				 * 来判断是否显示选中效果。 至于选中效果的规则,下面适配器的代码中会有说明
				 */
				// if(dataList.get(position).isSelected()){
				// dataList.get(position).setSelected(false);
				// }else{
				// dataList.get(position).setSelected(true);
				// }
				/**
				 * 通知适配器,绑定的数据发生了改变,应当刷新视图
				 */
				// adapter.notifyDataSetChanged();
				Intent intent = new Intent(AddPicActivity.this,
						ImageGridActivity.class);
				intent.putExtra(AddPicActivity.EXTRA_IMAGE_LIST,
						(Serializable) dataList.get(position).imageList);
				startActivity(intent);
				AddPicActivity.this.finish();
			}

		});
	}

3.进入相册,图片列表 ImageGridActivity

package com.pts.imagetestpic;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import com.pts.imagetestpic.adapter.ImageGridAdapter;
import com.pts.imagetestpic.adapter.ImageGridAdapter.TextCallback;
import com.pts.imagetestpic.pic.AlbumHelper;
import com.pts.imagetestpic.pic.Bimp;
import com.pts.imagetestpic.pic.ImageItem;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.GridView;
import android.widget.TextView;
import android.widget.Toast;

public class ImageGridActivity extends Activity implements OnClickListener {
	public static final String EXTRA_IMAGE_LIST = "imagelist";

	List<ImageItem> dataList;
	GridView gridView;
	ImageGridAdapter adapter;
	AlbumHelper helper;
	Button mBtnCommit;
	
	TextView mTxtBack;
	TextView mTxtTitle;

	Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				// 选择图片的数量可自行修改,这里限定最多选择4张
				Toast.makeText(ImageGridActivity.this, "最多选择4张图片", 400).show();
				break;

			default:
				break;
			}
		}
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_image_grid);

		helper = AlbumHelper.getHelper();
		helper.init(getApplicationContext());

		dataList = (List<ImageItem>) getIntent().getSerializableExtra(
				EXTRA_IMAGE_LIST);

		initView();
		initEvent();
	}

	public void initView() {
		mTxtBack = (TextView) findViewById(R.id.tv_back_top);
		mTxtTitle = (TextView) findViewById(R.id.tv_title);
		mTxtTitle.setText("列表");
		
		mBtnCommit = (Button) findViewById(R.id.btn_commit_album);
		gridView = (GridView) findViewById(R.id.gridview);
		gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
		adapter = new ImageGridAdapter(ImageGridActivity.this, dataList,
				mHandler);
		gridView.setAdapter(adapter);
		adapter.setTextCallback(new TextCallback() {
			public void onListen(int count) {
				mBtnCommit.setText("完成" + "(" + count + ")");
			}
		});

		gridView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				// if(dataList.get(position).isSelected()){
				// dataList.get(position).setSelected(false);
				// }else{
				// dataList.get(position).setSelected(true);
				// }
				adapter.notifyDataSetChanged();
			}

		});
	}

	public void initEvent() {
		mTxtBack.setOnClickListener(this);
		mBtnCommit.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.tv_back_top:
			this.finish();
			break;
		case R.id.btn_commit_album:
			ArrayList<String> list = new ArrayList<String>();
			Collection<String> c = adapter.map.values();
			Iterator<String> it = c.iterator();
			for (; it.hasNext();) {
				list.add(it.next());
			}

			for (int i = 0; i < list.size(); i++) {
				if (Bimp.drr.size() < 4) {
					Bimp.drr.add(list.get(i));
				}
			}

			ImageGridActivity.this.finish();
			break;

		default:
			break;
		}
	}

}


4.同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.

    <!-- 申明网络权限 -->
    <uses-permission android:name="android.permission.INTERNET" />

    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <!-- 申明权限 操作SD卡 -->
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

补充:

文章主要讲述了GridView控件实现添加本地图片并显示,实现了压缩本地图片并保存在临时文件夹中,失真度不明显,避免了内存溢出等异常导致应用程序崩溃,交互感非常强。

主要效果图:



完整项目下载链接:http://download.csdn.net/detail/emptoney/9618993




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值