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 mBase64; // base64集合private String mStrImageFile = "";private List mImgPath; // 图片path@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);mBase64 = new ArrayList();mImgPath = new ArrayList();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() {@Overridepublic 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);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_right_title:getPathList();if (mBase64.size() > 0) {getBase64();}break;default:break;}}@Overrideprotected 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);}// ----------------- 分割线 --------------------@Overrideprotected 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() {@Overridepublic 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 dataList;GridView gridView;ImageGridAdapter adapter;AlbumHelper helper;Button mBtnCommit;TextView mTxtBack;TextView mTxtTitle;Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0:// 选择图片的数量可自行修改,这里限定最多选择4张Toast.makeText(ImageGridActivity.this, "最多选择4张图片", 400).show();break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_grid);helper = AlbumHelper.getHelper();helper.init(getApplicationContext());dataList = (List) 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() {@Overridepublic 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);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_back_top:this.finish();break;case R.id.btn_commit_album:ArrayList list = new ArrayList();Collection c = adapter.map.values();Iterator 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卡和网络上传至服务器.
补充:
文章主要讲述了GridView控件实现添加本地图片并显示,实现了压缩本地图片并保存在临时文件夹中,失真度不明显,避免了内存溢出等异常导致应用程序崩溃,交互感非常强。
主要效果图:
完整项目下载链接:http://download.csdn.net/detail/emptoney/9618993
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
