Android自定义dialog——设置头像(拍照,相册)
需求场景:个人信息设置,点击头像,在界面上弹出一个弹框,用户选择“拍照”/“从图库选择”,选择照片后设置成头像,有时候还需要先进行剪裁。
首先,自定义弹框样式:
定义一个类继承Dialog类:
package com.way.coreyl.utils;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
import com.way.coreyl.R;
/**
* @author way
* @date 2016/8/20
*/
public class HeadDialog extends Dialog {
private TextView tv_getCamera, tv_getPic, tv_cancel;
private Context context;
private ClickListenerInterface clickListenerInterface;
public interface ClickListenerInterface {
public void doGetCamera();
public void doGetPic();
public void doCancel();
}
public HeadDialog(Context context) {
super(context,R.style.MyDialog);
this.context = context;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
}
private void init() {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.dialog_head, null);
setContentView(view);
tv_getCamera = (TextView) view.findViewById(R.id.tv_getCamera);
tv_getPic = (TextView) view.findViewById(R.id.tv_getPic);
tv_cancel = (TextView) view.findViewById(R.id.tv_cancel);
tv_getCamera.setText("拍照");
tv_getPic.setText("从图库中选择");
tv_cancel.setText("取消");
tv_getCamera.setOnClickListener(new clickListener());
tv_getPic.setOnClickListener(new clickListener());
tv_cancel.setOnClickListener(new clickListener());
Window dialogWindow = getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
// 获取屏幕宽高
DisplayMetrics d = context.getResources().getDisplayMetrics();
// 设置宽高
lp.width = (int) (d.widthPixels * 0.8);
dialogWindow.setAttributes(lp);
}
public void setClicklistener(ClickListenerInterface clickListenerInterface) {
this.clickListenerInterface = clickListenerInterface;
}
private class clickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.tv_getCamera:
clickListenerInterface.doGetCamera();
break;
case R.id.tv_getPic:
clickListenerInterface.doGetPic();
break;
case R.id.tv_cancel:
clickListenerInterface.doCancel();
break;
}
}
}
}
一个简单的xml(只有一张图片为例)
代码中设置图片:
package com.way.coreyl.activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.way.coreyl.R;
import com.way.coreyl.utils.CircleImageView;
import com.way.coreyl.utils.DiskUtils;
import com.way.coreyl.utils.HeadDialog;
import com.way.coreyl.utils.Util;
import java.io.File;
public class MainActivity extends AppCompatActivity {
private static final int CHOOSE_PICTURE = 2;
private static final int CROP_1_REQUEST = 3;
private static final int CROP_2_REQUEST = 4;
private static final int CAMERA_REQUEST = 1;
private ImageView img_head;
File file;
String path, saveName;
// 照片保存路径
File cameraFile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_head = (ImageView) findViewById(R.id.img_head);
}
public void onclick(View view) {
switch (view.getId()) {
case R.id.img_head:
// 打开自定义dialog
openDialog();
break;
}
}
private void openDialog() {
final HeadDialog headDialog = new HeadDialog(this);
headDialog.show();
headDialog.setClicklistener(new HeadDialog.ClickListenerInterface() {
@Override
public void doGetCamera() {
// 相机
headDialog.dismiss();
// Toast.makeText(getApplicationContext(), "相机", Toast.LENGTH_SHORT).show();
camera();
}
@Override
public void doGetPic() {
// 图库
headDialog.dismiss();
// Toast.makeText(getApplicationContext(), "tuku", Toast.LENGTH_SHORT).show();
crop(); // 打开图库并剪切
// gallery(); // 只是打开图库选一张照片
}
@Override
public void doCancel() {
// 取消
headDialog.dismiss();
}
});
}
// 相机
private void camera() {
Intent cameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraFile = DiskUtils.generatePhotoFile(this);
cameraintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
this.startActivityForResult(cameraintent, CAMERA_REQUEST);
}
// 图库——剪裁
private void crop() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,CROP_1_REQUEST);
}
// 图库
private void gallery() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,CHOOSE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
// 图库返回值
case CHOOSE_PICTURE:
Uri uri = data.getData();
//显示图片
path = getRealPathFromURI(uri);
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 设置进头像
img_head.setImageBitmap(bitmap);
file = new File(path);
// 比如上传图片 在这里再单独写个方法
// uploadImg(file);
break;
// 图库剪切
case CROP_1_REQUEST:
Uri uri_1 =data.getData();
startPhotoZoom(uri_1);
break;
case CROP_2_REQUEST:
Bitmap bitmap1 = data.getExtras().getParcelable("data");
img_head.setImageBitmap(bitmap1);
break;
// 相机
case CAMERA_REQUEST:
String imgUrl = cameraFile.getAbsolutePath();
int degree = Util.readPictureDegree(imgUrl);
Bitmap temp = BitmapFactory.decodeFile(imgUrl);
Bitmap bitmap2 = Util.rotateBitmap(temp,degree);
img_head.setImageBitmap(bitmap2);
break;
}
super.onActivityResult(requestCode, resultCode, data);
}
// 图片剪切
private void startPhotoZoom(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);
this.startActivityForResult(intent, CROP_2_REQUEST);
}
public String getRealPathFromURI(Uri contentUri) {
String res = null;
String[] proj = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
if (cursor.moveToFirst()) {
;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();
return res;
}
}