高仿微信本地图片选择器

在项目中经常需要选择手机系统里面的图片,但是直接启动系统页面,只能选择单张图片,而且UI不受我们自己控制,不灵活,所以这里仿照微信的大致效果,做一个图片选择器

加载图片的时候,使用的开源项目Universal-Image-Loader,示例代码如下:

MyApplication类:

package com.home.imgscan;import android.app.Application;import android.content.Context;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();initImageLoader(this,false);}/** * 初始化ImageLoader(在Application的onCreate()中调用) * * @param context *上下文对象 * @param isDebug *是否启用Debug模式 */public static void initImageLoader(Context context, boolean isDebug) {// 创建默认的ImageLoader配置参数ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(context);if (isDebug) {builder.writeDebugLogs();}ImageLoaderConfiguration configuration = builder.build();ImageLoader.getInstance().init(configuration);}}主页面:MainActivity:

package com.home.imgscan;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.app.ProgressDialog;import android.content.ContentResolver;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.provider.MediaStore;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;import android.widget.GridView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {// GridView控件private GridView gridView;// 进度对话框private ProgressDialog mProgressDialog;// 本地图片路径集合private List<String> list = new ArrayList<String>();// 加载完成标示private final static int SCAN_OK = 1;// 适配器private ScanAdapter adapter;// 发送按钮private TextView sendView;@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case SCAN_OK:mProgressDialog.dismiss();setAdapter();break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.main);initView();getImages();}/** * 初始化页面控件 */private void initView() {gridView = (GridView) findViewById(R.id.main_grid);// 发送按钮sendView = (TextView) findViewById(R.id.main_btn_send);sendView.setOnClickListener(this);}/** * 设置适配器 */private void setAdapter() {if (adapter == null) {adapter = new ScanAdapter(MainActivity.this, list);gridView.setAdapter(adapter);} else {adapter.setList(list);adapter.notifyDataSetChanged();}}/** * 获取手机上的图片 */private void getImages() {if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {Toast.makeText(this, "SD卡不存在", Toast.LENGTH_SHORT).show();return;}mProgressDialog = ProgressDialog.show(this, null, "正在加载请稍后…");new Thread(new Runnable() {@Overridepublic void run() {Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;ContentResolver mContentResolver = MainActivity.this.getContentResolver();Cursor mCursor = mContentResolver.query(mImageUri, null,MediaStore.Images.Media.MIME_TYPE + "=? or "+ MediaStore.Images.Media.MIME_TYPE + "=?",new String[] { "image/jpeg", "image/png" },MediaStore.Images.Media.DATE_MODIFIED);while (mCursor.moveToNext()) {String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Images.Media.DATA));list.add(path);}mCursor.close();mHandler.sendEmptyMessage(SCAN_OK);}}).start();}/** * 更新发送按钮 */public void updateSendBtn() {List<String> hasCheckedList = adapter.getHasCheckList();if (hasCheckedList == null || hasCheckedList.size() == 0) {sendView.setText("发送");} else {int size = hasCheckedList.size();sendView.setText("发送(" + size + "/9)");}}@Overridepublic void onClick(View v) {if (v.getId() == R.id.main_btn_send) {List<String> hasCheckedList = adapter.getHasCheckList();if (hasCheckedList == null || hasCheckedList.size() == 0) {Toast.makeText(this, "请选择图片", Toast.LENGTH_SHORT).show();return;}// 发送。。。}}}自定义适配器ScanAdapter:

package com.home.imgscan;import java.util.ArrayList;import java.util.List;import android.graphics.Bitmap;import android.text.TextUtils;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.Toast;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.download.ImageDownloader.Scheme;public class ScanAdapter extends BaseAdapter {private List<String> list;private LayoutInflater inflater;// 已经选择的图片本地路径集合private List<String> hasCheckList = new ArrayList<String>();private MainActivity activity;public ScanAdapter(MainActivity activity, List<String> list) {this.list = list;this.activity = activity;inflater = LayoutInflater.from(activity);}@Overridepublic int getCount() {return list == null ? 0 : list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup arg2) {if (convertView == null) {convertView = inflater.inflate(R.layout.grid_content, null);}String path = list.get(position);// 选择框ImageView box = getAdapterView(convertView, R.id.grid_content_box, path);box.setOnClickListener(new MyOnClickListener());// 图片控件ImageView iv = getAdapterView(convertView, R.id.grid_content_iv, path);setLocalImg(iv, path);return convertView;}private class MyOnClickListener implements OnClickListener {@Overridepublic void onClick(View v) {if (v.getId() != R.id.grid_content_box) {return;}String path = (String) v.getTag();if (TextUtils.isEmpty(path)) {return;}if (hasCheckList.contains(path)) {hasCheckList.remove(path);v.setBackgroundResource(R.drawable.box_unchecked);} else {if (hasCheckList.size() >= 9) {Toast.makeText(activity, "最多只能选择9张图片", Toast.LENGTH_SHORT).show();return;}hasCheckList.add(path);v.setBackgroundResource(R.drawable.box_checked);}activity.updateSendBtn();}}@SuppressWarnings("unchecked")public <T extends View> T getAdapterView(View convertView, int id,Object tag) {SparseArray<View> viewHolder = null;try {if (convertView.getTag(R.id.view_holder) instanceof SparseArray<?>) {viewHolder = (SparseArray<View>) convertView.getTag(R.id.view_holder);}} catch (ClassCastException e) {}if (viewHolder == null) {viewHolder = new SparseArray<View>();convertView.setTag(R.id.view_holder, viewHolder);convertView.setTag(R.id.path, tag);}View childView = viewHolder.get(id);if (childView == null) {childView = convertView.findViewById(id);childView.setTag(tag);viewHolder.put(id, childView);}return (T) childView;}/** * 加载本地图片 * * @param imageView *图片ImageView控件 * @param imagePath *图片本地路径 */public static void setLocalImg(ImageView imageView, String imagePath) {// 显示图片的配置DisplayImageOptions.Builder builder = new DisplayImageOptions.Builder();builder.cacheInMemory(true).cacheOnDisk(true).bitmapConfig(Bitmap.Config.RGB_565);DisplayImageOptions options = builder.build();ImageLoader.getInstance().displayImage(Scheme.FILE.wrap(imagePath),imageView, options);}public List<String> getList() {return list;}public void setList(List<String> list) {this.list = list;}public List<String> getHasCheckList() {return hasCheckList;}public void setHasCheckList(List<String> hasCheckList) {this.hasCheckList = hasCheckList;}}布局文件main.xml:

经验是由痛苦中粹取出来的

高仿微信本地图片选择器

相关文章:

你感兴趣的文章:

标签云: