您的位置:首页 > 移动开发 > Android开发

Android裁剪圆形头像源码

2014-12-08 17:50 316 查看
最近项目上要加一个小功能,裁剪图片生成圆形头像。我参考资料写了个小demo,大家可以参考一下。下面是代码,不难,容易有坑的地方稍微加了下注释。

package com.example.cutpicturedemo;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import java.io.File;

public class MainActivity extends Activity implements View.OnClickListener {
private ImageView photo;
private final int REQUEST_CODE_CAMERA = 1;
private final int REQUEST_CODE_GALLERY = 2;
private final int REQUEST_CODE_CUT_PHOTO = 3;
private final int ACTION_CODE_CAMERA = -1;
private final int ACTION_CODE_GALLERY = -2;
private final String PHOTO_TEMP_PATH = "/Img/photo.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.photo = ((ImageView) findViewById(R.id.photo));
this.photo.setOnClickListener(this);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode) {
case REQUEST_CODE_CAMERA:
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if(localFile.exists()){
cutPhoto(Uri.fromFile(localFile));
}
break;
//下面两种情况需要检查下data为空的情况
case REQUEST_CODE_GALLERY:
if (data != null) {
cutPhoto(data.getData());
}
break;
case REQUEST_CODE_CUT_PHOTO:
if (data != null) {
setPhoto(data);
}
break;
default:
break;
}
super.onActivityResult(requestCode, resultCode, data);
}

private void showPickDialog() {
PickPhotoListener mPickPhotoListener = new PickPhotoListener();
new AlertDialog.Builder(this)
.setTitle("更换头像")
.setMessage("选择图片")
.setPositiveButton("相机", mPickPhotoListener)
.setNegativeButton("图库", mPickPhotoListener)
.create()
.show();
}

public Bitmap getCirclePhoto(Bitmap paramBitmap) {
Bitmap localBitmap = Bitmap.createBitmap(paramBitmap.getWidth(),
paramBitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas localCanvas = new Canvas(localBitmap);
Paint localPaint = new Paint();
Rect localRect = new Rect(0, 0, paramBitmap.getWidth(),
paramBitmap.getHeight());
localPaint.setAntiAlias(true);
localPaint.setFilterBitmap(true);
localPaint.setDither(true);
localCanvas.drawARGB(0, 0, 0, 0);
localCanvas.drawCircle(paramBitmap.getWidth() / 2,
paramBitmap.getHeight() / 2, paramBitmap.getWidth() / 2,
localPaint);
//这个是利用了ProterDuffXfermode裁剪图片

localPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
localCanvas.drawBitmap(paramBitmap, localRect, localRect, localPaint);
return localBitmap;
}

@Override
public void onClick(View paramView) {
showPickDialog();
}

public void cutPhoto(Uri paramUri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(paramUri, "image/*")
.putExtra("crop", "true")
.putExtra("aspectX", 1)
.putExtra("aspectY", 1)
/*这里注意一下,输出图片的大小要控制一下
* 300 300指的是像素
* 因为输出数据是通过Intent传输的
* 大小控制在360*360以内,但是太小图片就模糊了,建议在150~350之间
*/
.putExtra("outputX", 300)
.putExtra("outputY", 300)
.putExtra("return-data", true);
startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CUT_PHOTO);
}

public void setPhoto(Intent paramIntent) {
Bundle localBundle = paramIntent.getExtras();
if (localBundle != null) {
Bitmap localBitmap = (Bitmap) localBundle.getParcelable("data");
this.photo.setImageBitmap(getCirclePhoto(localBitmap));
// this.photo.setImageBitmap(localBitmap);
File localFile = new File(Environment.getExternalStorageDirectory()
+ MainActivity.this.PHOTO_TEMP_PATH);
if (localFile.exists()){
localFile.delete();
Log.v("delete photo", "down");
}
}
}

private class PickPhotoListener implements DialogInterface.OnClickListener {

@Override
public void onClick(DialogInterface paramDialogInterface, int actionCode) {

if (actionCode == MainActivity.this.ACTION_CODE_CAMERA) {
paramDialogInterface.dismiss();
Intent intent = new Intent(
"android.media.action.IMAGE_CAPTURE");
intent.putExtra("output", Uri.fromFile(new File(
Environment.getExternalStorageDirectory(),
MainActivity.this.PHOTO_TEMP_PATH)));
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_CAMERA);
}

if (actionCode == MainActivity.this.ACTION_CODE_GALLERY) {
paramDialogInterface.dismiss();
Intent intent = new Intent("android.intent.action.PICK",
null);
intent.setDataAndType(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
"image/*");
MainActivity.this.startActivityForResult(intent, MainActivity.this.REQUEST_CODE_GALLERY);
}
}
}
}

源码我就不上传了,就这一个Activity,Layout就只有一个ImageView子元素。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息