一款支持本地相册选取和拍照上传的图片选择器,之前在项目中也有用到,今天就把我自己写的图片选择器分享给大家:
一如往常,先贴出一张效果图
接下来是实现步骤:
步骤一:首先需要在配置清单中声明相应的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
步骤二:定义好在什么地方需要弹出的窗口以及弹出的内容,我这个地方用的是在屏幕下方弹出一个如下图的PopupWindow。
步骤三:开始对每一个需要监听的地方进行监听
/**
* 按钮的点击监听
*/
private class ButtonListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.but_image:
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
if (mPopupWindowDialog != null) {
mPopupWindowDialog.showAtLocation(findViewById(R.id.but_image), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
}
break;
case R.id.textview_dialog_take_picture:// 拍照
getImageFromCamera();
dismPopupWindowDialog();
break;
case R.id.textview_dialog_album:// 相册
dismPopupWindowDialog();
putPhoto();
break;
case R.id.textview_dialog_cancel: // 取消
dismPopupWindowDialog();
break;
}
}
}
对每一个方法进行相应的处理,举个拍照的例子:使用startActivityForResult的启动方式来处理回传数据,
/**
* 拍照
*/
protected void getImageFromCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = Uri.fromFile(new File(tempPath));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CODE_CAPTURE_CAMEIA);
}
然后在onActivityResult中去处理回传的数据:
BitmapFactory.Options option = new BitmapFactory.Options();
option.inJustDecodeBounds = true;// 如果设置为true,则解码器将返回null(无位图),但是out ...字段仍将被设置,允许调用者查询位图,而不必为其像素分配内存
Bitmap bitmap = BitmapFactory.decodeFile(tempPath, option);
option.inJustDecodeBounds = false;
option.inSampleSize = 4;//如果设置为值> 1,请求解码器对原始图像进行子采样,返回较小的图像以节省内存。
bitmap = BitmapFactory.decodeFile(tempPath, option);
bmpList.add(bitmap);//添加进集合里
showPrevious();//在对应的控件里面显示
到这里获取一张拍照上传的图片就基本完善了,最后是获取到需要上传的图片然后查看大图,这个地方需要对临时的Imageview进行点击监听
// iv1的点击事件
private View.OnClickListener imageView1_click = new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.putExtra("index", 1);
BitmapUtil.getInstance().setBitmap(bmpList.get(0));//获取集合里面的对象
intent.setClass(MainActivity.this, ImageDetailActivity.class);
startActivityForResult(intent, PICTER_DEAL);
}
};
然后在详情的activity里面去这样处理图片,注意这个地方需要把XML文件中ImageView控件的类型设置为centerCrop
@SuppressLint("NewApi")
public void loadImg() {
Intent intent = getIntent();
index = intent.getIntExtra("index", 0);
Bitmap bitmap = BitmapUtil.getInstance().getBitmap();
if (bitmap != null) iv.setBackground(new BitmapDrawable(bitmap));
}
这个地方一个完整的拍照上传的图片选择器就处理完了,最后贴上源代码