1. 程式人生 > >android使用ucrop實現頭像裁剪,圖片裁剪的使用

android使用ucrop實現頭像裁剪,圖片裁剪的使用

github地址  https://github.com/linliangliang/CorpIamge

uCrop 支援縮放圖片,旋轉圖片,改變裁剪長寬比例,支援出手勢:一根指頭滑動圖片,兩根指頭旋轉圖片,捏拉縮放,雙擊縮放。等功能。對於裁剪頭像的需求基本滿足。

下面記錄在學習頭像裁剪的筆記,以及一個上傳到git的demo。

1、依賴新增

//專案中的build.gradle
allprojects {
    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

//App中的build.gradle
compile 'com.github.yalantis:ucrop:2.2.1'

2、許可權申請(android6.0及以上需要動態申請許可權,我在其他部落格中也寫過這麼不再貼,可以在github中檢視)

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!--允許讀取手機狀態-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />

3、開始寫程式碼

3.1 在androidmanifest.xml中註冊裁剪圖片的activity

<!--android:screenOrientation="portrait"表示豎屏-->
<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" />

3.2 圖片有兩種方式獲取,從相簿選擇,或者拍照

/**
     * 從相簿選擇圖片
     *
     * @param activity
     */
    public static void choosePhoto(Activity activity) {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_PICK);//開啟相簿
        //REQUEST_PICTURE_CHOOSE表示請求引數,是個常量
        activity.startActivityForResult(intent, REQUEST_PICTURE_CHOOSE);
    }

    /**
     * 開啟相機拍照
     *
     * @param activity
     * @return
     */
    public static void openCamera(Activity activity) {
        //CROPIMAGEROOT是我為app建立的一個根目錄資料夾,
        //定義方式:
        //private final static String CROPIMAGEROOT = Environment.getExternalStorageDirectory() + "/myAppName/";
        //當然這個目錄需要自己建立,可以下載demo檢視

        //mPictureFile 拍照後圖片儲存的檔案。
        mPictureFile = new File(CROPIMAGEROOT, "_" + System.currentTimeMillis() + ".jpg");
        imageUri = Uri.fromFile(mPictureFile);
        // 啟動拍照,並儲存到臨時檔案
        Intent mIntent = new Intent();
        mIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPictureFile));
        mIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
        activity.startActivityForResult(mIntent, REQUEST_CAMERA_IMAGE);
    }

其中註釋已經橫清楚了

 

3.3選擇圖片後在 ActivityforResult()中呼叫裁剪圖片的方法,裁剪完後,還是在 ActivityforResult()對裁剪後的結果進行處理。

這裡直接貼出整個ActivityforResult()

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {

            //相簿
            case REQUEST_PICTURE_CHOOSE:
                if (resultCode == RESULT_OK) {
                    Uri sourceUri = data.getData();
                    startUCrop(sourceUri);

                } else {
                    Toast.makeText(this, "選圖失敗!", Toast.LENGTH_SHORT).show();
                }
                break;
            //照相
            case REQUEST_CAMERA_IMAGE:
                if (resultCode == RESULT_OK) {
                    if (data != null) {
                        startUCrop(imageUri);
                    } else {
                        Toast.makeText(this, "拍照失敗!", Toast.LENGTH_SHORT).show();
                    }
                }
                break;
            //裁剪後的效果
            case UCrop.REQUEST_CROP:
                if (resultCode == RESULT_OK) {
                    Uri resultUri = UCrop.getOutput(data);
                    try {
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(resultUri));
                        avatarImage.setImageBitmap(bitmap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
            //錯誤裁剪的結果
            case UCrop.RESULT_ERROR:
                if (resultCode == RESULT_OK) {
                    final Throwable cropError = UCrop.getError(data);
                    handleCropError(cropError);
                }
                break;
        }
    }

3.4 實現圖片裁剪的函式

     /**
     * 裁剪圖片
     *
     * @param sourceUri
     */
    private void startUCrop(Uri sourceUri) {
        UCrop.Options options = new UCrop.Options();
        //裁剪後圖片儲存在資料夾中
        Uri destinationUri = Uri.fromFile(new File(CROPIMAGEROOT, "uCrop.jpg"));
        UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一個引數是裁剪前的uri,第二個引數是裁剪後的uri
        uCrop.withAspectRatio(1, 1);//設定裁剪框的寬高比例
        //下面引數分別是縮放,旋轉,裁剪框的比例
        options.setAllowedGestures(com.yalantis.ucrop.UCropActivity.ALL, com.yalantis.ucrop.UCropActivity.NONE, com.yalantis.ucrop.UCropActivity.ALL);
        options.setToolbarTitle("移動和縮放");//設定標題欄文字
        options.setCropGridStrokeWidth(2);//設定裁剪網格線的寬度(我這網格設定不顯示,所以沒效果)
        //options.setCropFrameStrokeWidth(1);//設定裁剪框的寬度
        options.setMaxScaleMultiplier(3);//設定最大縮放比例
        //options.setHideBottomControls(true);//隱藏下邊控制欄
        options.setShowCropGrid(true);  //設定是否顯示裁剪網格
        //options.setOvalDimmedLayer(true);//設定是否為圓形裁剪框
        options.setShowCropFrame(true); //設定是否顯示裁剪邊框(true為方形邊框)
        options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//標題字的顏色以及按鈕顏色
        options.setDimmedLayerColor(Color.parseColor("#AA000000"));//設定裁剪外顏色
        options.setToolbarColor(Color.parseColor("#000000")); // 設定標題欄顏色
        options.setStatusBarColor(Color.parseColor("#000000"));//設定狀態列顏色
        options.setCropGridColor(Color.parseColor("#ffffff"));//設定裁剪網格的顏色
        options.setCropFrameColor(Color.parseColor("#ffffff"));//設定裁剪框的顏色
        uCrop.withOptions(options);
        /*//裁剪後儲存到檔案中
        Uri destinationUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/myxmpp/" + "test1.jpg"));
        UCrop uCrop = UCrop.of(sourceUri, destinationUri);
        UCrop.Options options = new UCrop.Options();
        //設定裁剪圖片可操作的手勢
        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        //設定toolbar顏色
        options.setToolbarColor(ActivityCompat.getColor(this, R.color.orange2));
        //設定狀態列顏色
        options.setStatusBarColor(ActivityCompat.getColor(this, R.color.orange2));
        //是否能調整裁剪框
        options.setFreeStyleCropEnabled(true);
        options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//標題字的顏色以及按鈕顏色
        options.setDimmedLayerColor(Color.parseColor("#AA000000"));//設定裁剪外顏色
        options.setToolbarColor(Color.parseColor("#000000")); // 設定標題欄顏色
        options.setStatusBarColor(Color.parseColor("#000000"));//設定狀態列顏色
        options.setCropGridColor(Color.parseColor("#ffffff"));//設定裁剪網格的顏色
        options.setCropFrameColor(Color.parseColor("#ffffff"));//設定裁剪框的顏色
        //options.setShowCropFrame(false); //設定是否顯示裁剪邊框(true為方形邊框)

        uCrop.withOptions(options);*/
        uCrop.start(this);
    }

實現裁剪可以定製不同的功能,註釋寫的很清楚,這裡不再贅述。可以自己修改,慢慢檢視執行效果。

其中UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一個引數是裁剪前的uri,第二個引數是裁剪後的uri。

完成裁剪之後,在ActivityforResult()中將圖片顯示在某個imageView中。

 

這個好像不支援圓形圖片的裁剪。稍後將介紹另一種庫實現圓形圖片的裁剪

github地址  https://github.com/linliangliang/CorpIamge