可以选择多张图片,对图片进行预览,预览时可以进行删除选中的图片 ,很不错的一个图片选择器。
至于图片如何上传,用什么网络框架,这里就不说了,你们自己决定怎么上传图片,可以选择表单上传的方式,也可以选择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