Android自定义dialog——设置头像(拍照,相册)

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;
    }

}


水平实在有限,若有漏错,欢迎指正!
BTW,哪位大神能教教我相机拍完之后再剪裁怎么写么。。。

你可能感兴趣的:(Android自定义dialog——设置头像(拍照,相册))