现在几乎所有的App都有用户登录模块,需要设置用户头像,而关于用户头像部分无疑也是比较头疼的,目前大部分应用的头像部分会有两种方式:一种是利用系统的裁剪功能去获取用户头像,一种就是获取到图片或者照片的地址后自定义头像裁剪界面。而我这里提供了一种利用系统的裁剪功能来获取头像的写法,当然我写的这个只是实现一个简单地功能,比较简单。如果大家有比较好的写法可以和我交流下。
没图说个JB,先看看效果:
首先是打开系统相册,实现代码:
Intentintent=newIntent(Intent.ACTION_PICK,null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent,2);
通过onActivityResult方法得到返回的intent数据:
@Override
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
//TODOAuto-generatedmethodstub
super.onActivityResult(requestCode,resultCode,data);
switch(requestCode){
case2:
if(layout_pop!=null){
layout_pop.dismiss();
}
Uriuri=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;
case3:
if(layout_pop!=null){
layout_pop.dismiss();
}
if(data==null){
return;
}else{
saveCropAvator(data);
}
break;
default:
break;
}
}
图像裁剪实现代码:
privatevoidstartImageAction(Uriuri,intoutputX,intoutputY,intrequestCode,booleanisCrop){
Intentintent=null;if(isCrop){
intent=newIntent("com.android.camera.action.CROP");
}else{
intent=newIntent(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",pressFormat.JPEG.toString());
intent.putExtra("noFaceDetection",true);//nofacedetectionstartActivityForResult(intent,requestCode);
}
对头像裁剪过后,还需要将图片变为圆角,处理方法为:
/**
*将图片变为圆角
*
*@parambitmap
*原Bitmap图片
*@parampixels
*图片圆角的弧度(单位:像素(px))
*@return带有圆角的图片(Bitmap类型)*/
publicstaticBitmaptoRoundCorner(Bitmapbitmap,intpixels){
Bitmapoutput=Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(),Config.ARGB_8888);
Canvascanvas=newCanvas(output);finalintcolor=0xff424242;finalPaintpaint=newPaint();finalRectrect=newRect(0,0,bitmap.getWidth(),bitmap.getHeight());finalRectFrectF=newRectF(rect);finalfloatroundPx=pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0,0,0,0);
paint.setColor(color);
canvas.drawRoundRect(rectF,roundPx,roundPx,paint);
paint.setXfermode(newPorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap,rect,rect,paint);returnoutput;
}
最后保存图片:
/**
*保存裁剪的头像
*
*@paramdata*/
privatevoidsaveCropAvator(Intentdata){
Bundleextras=data.getExtras();if(extras!=null){
Bitmapbitmap=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();
}
}
}
}