因為項目中有裁剪圖片這一需求,我在網上找到了Android Image Cropper,一款使用起來非常簡單第三方圖片裁剪框架,在此記錄一下。
項目的github地址:https://github.com/ArthurHub/Android-Image-Cropper
效果圖如下
Android Image Cropper有兩種使用方法:
1、Activity用法
(1)在app模塊的build.gradle文件中添加依賴
api 'com.theartofdev.edmodo:android-image-cropper:2.8.+'
(2)在AndroidManifest.xml文件中聲明所需要的權限
<!--讀取SD卡--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!--寫入SD卡--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
(3)在AndroidManifest.xml文件中注冊CropImageActivity
<activity android:name="com.theartofdev.edmodo.cropper.CropImageActivity" android:theme="@style/Base.Theme.AppCompat" /> <!-- optional (needed if default theme has no action bar) -->
(4)在需要裁減圖片的地方啟動CropImageActivity
CropImage.activity() .setGuidelines(CropImageView.Guidelines.ON) //開啟選擇器 .setActivityTitle("頭像裁剪") .setCropShape(CropImageView.CropShape.RECTANGLE) //選擇矩形裁剪 .start(UserDataActivity.this);
(5)重寫onActivityResult,獲取裁剪后的圖片的uri:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //用戶沒有進行有效的設置操作,返回 if (resultCode == RESULT_CANCELED) { Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show(); return; } switch (requestCode) { case CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE:{ CropImage.ActivityResult result = CropImage.getActivityResult(data); if(resultCode==RESULT_OK){ final Uri resultUri = result.getUri(); //獲取裁減后的圖片的Uri saveHeadPortrait(resultUri); //我自己寫的處理圖片的方法 }else if(resultCode==CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE){ Log.d("PhotoActivity", "onActivityResult: Error"); Exception exception = result.getError(); } break; } super.onActivityResult(requestCode, resultCode, data); }
2、View用法
(1)(2)步和Activity用法一樣。
(3)增加CropImageView到Activity的布局文件中
<!-- Image Cropper fill the remaining available height --> <com.theartofdev.edmodo.cropper.CropImageView xmlns:custom="http://schemas.android.com/apk/res-auto" android:id="@+id/cropImageView" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/>
(4)用的時候設置圖片的uri
cropImageView.setImageUriAsync(uri); // or (prefer using uri for performance and better user experience) cropImageView.setImageBitmap(bitmap);
(5)獲取裁減后的圖片
// subscribe to async event using cropImageView.setOnCropImageCompleteListener(listener) cropImageView.getCroppedImageAsync(); // or Bitmap cropped = cropImageView.getCroppedImage();