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

Android实现类似换QQ头像功能(图片裁剪)

2014-08-20 10:04 806 查看
现在几乎所有的App都有用户登录模块,需要设置用户头像,而关于用户头像部分无疑也是比较头疼的,目前大部分应用的头像部分会有两种方式:一种是利用系统的裁剪功能去获取用户头像,一种就是获取到图片或者照片的地址后自定义头像裁剪界面。而我这里提供了一种利用系统的裁剪功能来获取头像的写法,当然我写的这个只是实现一个简单地功能,比较简单。如果大家有比较好的写法可以和我交流下。

没图说个JB,先看看效果:

图:

2. 图

3. 图

4. 图


首先是打开系统相册,实现代码:

Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CON   TENT_URI, "image/*");
startActivityForResult(intent,2);


通过onActivityResult方法得到返回的intent数据:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 2:
if (layout_pop != null) {
layout_pop.dismiss();
}
Uri uri = null;
if (data == null) {
return;
}
if (resultCode == RESULT_OK) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "SD不可用",1).show();
return;
}
uri = data.getData();
startImageAction(uri, 200, 200,3, true);
} else {
Toast.makeText(this, "照片获取失败",1).show();
}
break;
case 3:
if (layout_pop != null) {
layout_pop.dismiss();
}
if (data == null) {
return;
} else {
saveCropAvator(data);
}
break;

default:
break;
}
}


图像裁剪实现代码:

private void startImageAction(Uri uri, int outputX, int outputY,
int requestCode, boolean isCrop) {
Intent intent = null;
if (isCrop) {
intent = new Intent("com.android.camera.action.CROP");
} else {
intent = new Intent(Intent.ACTION_GET_CONTENT, null);
}
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
intent.putExtra("return-data", true);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}


对头像裁剪过后,还需要将图片变为圆角,处理方法为:

/**
* 将图片变为圆角
*
* @param bitmap
*            原Bitmap图片
* @param pixels
*            图片圆角的弧度(单位:像素(px))
* @return 带有圆角的图片(Bitmap 类型)
*/
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);

return output;
}


最后保存图片:

/**
* 保存裁剪的头像
*
* @param data
*/
private void saveCropAvator(Intent data) {
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap bitmap = extras.getParcelable("data");
Log.i("life", "avatar - bitmap = " + bitmap);
if (bitmap != null) {
bitmap = toRoundCorner(bitmap, 10);//调用圆角处理方法
headImageView.setImageBitmap(bitmap);
if (bitmap != null && bitmap.isRecycled()) {
bitmap.recycle();
}
}
}
}


当然这只是一个简单地demo,如果完整的实现需要把改变后的图像保存在本地,然后上传到服务器,还可以通过调用照相机拍照更换头像,其实实现原理是一样的,只需要找到当前拍照后图片的路径即可。

由于小弟一直在园子里潜水,笔头排版什么的很烂,将就看吧。

还有我不知道怎么把demo放上来,要的留下邮箱哦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: