Android实现类似换QQ头像功能(图片裁剪)
现在几乎所有的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放上来,要的留下邮箱哦。