Android之图片选择器

来源:互联网 发布:淘宝网品牌女鞋 编辑:程序博客网 时间:2024/05/16 10:02

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

至于图片如何上传,用什么网络框架,这里就不说了,你们自己决定怎么上传图片,可以选择表单上传的方式,也可以选择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@Overrideprotected 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() {@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<ImageItem> 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<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() {@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<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
原创粉丝点击