Android實現類似換QQ頭像功能(圖片裁剪)


      現在幾乎所有的App都有用戶登錄模塊,需要設置用戶頭像,而關於用戶頭像部分無疑也是比較頭疼的,目前大部分應用的頭像部分會有兩種方式:一種是利用系統的裁剪功能去獲取用戶頭像,一種就是獲取到圖片或者照片的地址后自定義頭像裁剪界面。而我這里提供了一種利用系統的裁剪功能來獲取頭像的寫法,當然我寫的這個只是實現一個簡單地功能,比較簡單。如果大家有比較好的寫法可以和我交流下。

      沒圖說個JB,先看看效果:

  1. 圖:  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放上來,要的留下郵箱哦。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM