您的位置:首页 > 其它

相机或相册选择图片

2016-03-29 16:09 92 查看
选择用户头像时有拍照和从相册选取两种方式,这首先来定义下选择方式的界面,仿ios底部弹出选择框,使用继承dialog方式实现。

在构造方法里初始化,这dialog实际是放了个竖向的LinearLayout,添加一个个textview显示。

private void init(Context context) {
this.context = context;
linearLayout = new LinearLayout(context);
linearLayout.setPadding(8, 0, 8, 0);
linearLayout.setOrientation(LinearLayout.VERTICAL);
params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(0, 0, 0, 1);//菜单项每条间留一点空隙就行了
params_cancel = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params_cancel.setMargins(0, 8, 0, 8);//最后一个放取消按钮,上下边距稍微大点
requestWindowFeature(Window.FEATURE_NO_TITLE);//对话框没有title,要不上面一块黑
setContentView(linearLayout);
initWindow(getWindow());
}

//设置dialog窗口样式
private void initWindow(Window window) {
WindowManager.LayoutParams params = window.getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.BOTTOM;//设置宽高,位置在底部
params.dimAmount = 0.2f;//对话框后面黑色不透明度
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
window.setAttributes(params);
}


设置完样式接下来就是用户设置菜单项和点击事件了

public void setMenus(String[] menus, OnItemClickListener onItemClickListener) {
for (int i = 0; i < menus.length + 1; i++) {
Button button = new Button(context);
if (i == menus.length) {
button.setText("取消");
button.setLayoutParams(params_cancel);
} else {
button.setText(menus[i]);
button.setLayoutParams(params);
}
button.setTextSize(18);
button.setTag(i);
button.setOnClickListener(this);
button.setBackgroundResource(R.drawable.item_list_bg);
linearLayout.addView(button);
}
this.onItemClickListener = onItemClickListener;
}

public void onClick(View v) {
int position = (int) v.getTag();
if (onItemClickListener != null) {
onItemClickListener.onItemClick(position);
}
dismiss();
}


界面调用时new一个show就可以了,接下来就是点击选择图片,由于拍照要在onactivityresult里拿到图片路径,这里将选择图片写成一个activity。

//使用拍照方式获取图片,参数为是否剪裁图片
protected void useCamera(boolean isCrop) {
this.isCrop = isCrop;
File file = new File(directory, "IMG_" + TimeUtil.getCurTime("yyyyMMdd_HHmmss") + ".jpg");
uri = Uri.fromFile(file);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CAMERA);
}

//从相册选取图片
protected void selectPhoto(boolean isCrop) {
this.isCrop = isCrop;
Intent intent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, REQUEST_PHOTO);
}

//剪裁图片
private void crop(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, REQUEST_CROP);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CAMERA:
if (isCrop) {
crop(uri);//去剪裁
} else {
//选完照片调用的方法,子类重写该方法
onSelectPic(uri, getUriPath(uri));
}
break;
case REQUEST_PHOTO:
uri = data.getData();
if (isCrop) {
crop(uri);
} else {
onSelectPic(uri, getUriPath(uri));
}
break;
case REQUEST_CROP://剪裁完
Bitmap bitmap = data.getParcelableExtra("data");
saveBitmap(bitmap, cropFile);
String path = cropFile.getAbsolutePath();
onCrop(bitmap, path);//如果选取时剪裁了子类重写该方法
break;
}
}
}
//将图片保存到文件里
private void saveBitmap(Bitmap bitmap, File file) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//选完图片拿到uri,根据uri拿到图片path
protected String getUriPath(Uri uri) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
String path = cursor.getString(cursor.getColumnIndex("_data"));
cursor.close();
return path;
}
return uri.getPath();
}

//有的奇葩手机选完图片后图片会倒过来,这里拿到图片的旋转方向
private int getDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
//将图片旋转
private Bitmap rotateBitmap(Bitmap bitmap, int degree) {
Matrix matrix = new Matrix();//matrix是一个3*3的矩阵,可以实现图片的旋转缩放平移,createbitmap时可以用到这参数
matrix.postRotate(degree);
Bitmap b = null;
try {
b = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (Exception e) {
e.printStackTrace();
}
if (b == null) {
return bitmap;
}
if (b != bitmap) {
bitmap.recycle();
}
return b;
}


使用时继承该activity,然后在点击事件里调用useCamera或selectPhoto方法,重写onSelectPic方法,得到图片uri和路径。

如果要剪裁图片,参数传true,重写onCrop。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: