android使用ucrop實現頭像裁剪,圖片裁剪的使用
阿新 • • 發佈:2019-01-13
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中。
這個好像不支援圓形圖片的裁剪。稍後將介紹另一種庫實現圓形圖片的裁剪