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

pphe 9年前

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

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


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

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

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

原文地址:http://www.cnblogs.com/evilfei/p/3923495.html