diff --git a/README.md b/README.md index 59d330b48..65c01e91b 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Get it on Google Play -1. Include the library as local library project. +1. Include the library as a local library project. ``` allprojects { @@ -25,9 +25,9 @@ ``` ``` implementation 'com.github.yalantis:ucrop:2.2.3' ``` - lightweight general solution - + ``` implementation 'com.github.yalantis:ucrop:2.2.3-native' ``` - get power of the native code to preserve image quality (+ about 1.5 MB to an apk size) - + 2. Add UCropActivity into your AndroidManifest.xml ``` @@ -73,15 +73,15 @@ If you want to let your users choose crop ratio dynamically, just do not call `w uCrop builder class has method `withOptions(UCrop.Options options)` which extends library configurations. -Currently you can change: +Currently, you can change: * image compression format (e.g. PNG, JPEG, WEBP), compression * image compression quality [0 - 100]. PNG which is lossless, will ignore the quality setting. * whether all gestures are enabled simultaneously - * maximum size for Bitmap that is decoded from source Uri and used within crop view. If you want to override default behaviour. + * maximum size for Bitmap that is decoded from source Uri and used within crop view. If you want to override the default behaviour. * toggle whether to show crop frame/guidelines * setup color/width/count of crop frame/rows/columns - * choose whether you want rectangle or oval crop area + * choose whether you want rectangle or oval(`options.setCircleDimmedLayer(true)`) crop area * the UI colors (Toolbar, StatusBar, active widget state) * and more... @@ -90,20 +90,29 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time ```java new UCropInitializer().setOkHttpClient(client); ``` - + # Compatibility - + * Library - Android ICS 4.0+ (API 14) (Android GINGERBREAD 2.3+ (API 10) for versions <= 1.3.2) * Sample - Android ICS 4.0+ (API 14) * CPU - armeabi armeabi-v7a x86 x86_64 arm64-v8a (for versions >= 2.1.2) - + # Changelog + +### Version: 2.2.8 + +* Merged pending pull requests with improvements and bugfixes +* Update compileSdk and targetSdk versions up to 31 +* Add localizations +* Fixed [#609](https://github.com/Yalantis/uCrop/issues/609) +* Fixed [#794](https://github.com/Yalantis/uCrop/issues/794) + ### Version: 2.2.3 - * Several fixes including [#445](https://github.com/Yalantis/uCrop/issues/445), [#465](https://github.com/Yalantis/uCrop/issues/465) and more! - * Material design support + * Several fixes including [#445](https://github.com/Yalantis/uCrop/issues/445), [#465](https://github.com/Yalantis/uCrop/issues/465) and more! + * Material design support * uCrop fragment as child fragment - * Added Italian language + * Added the Italian language ### Version: 2.2.2 @@ -122,7 +131,7 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time ### Version: 2.1 * Fixes issue with EXIF data (images taken on front camera with Samsung devices mostly) [#130](https://github.com/Yalantis/uCrop/issues/130) [#111](https://github.com/Yalantis/uCrop/issues/111) - * Added API to set custom set of aspect ratio options for user. [#131](https://github.com/Yalantis/uCrop/issues/131) + * Added API to set custom set of aspect ratio options for the user. [#131](https://github.com/Yalantis/uCrop/issues/131) * Added API to set all configs via UCrop.Options class. [#126](https://github.com/Yalantis/uCrop/issues/126) * Added ABI x86_64 support. [#105](https://github.com/Yalantis/uCrop/issues/105) @@ -131,7 +140,7 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time * Native image crop (able to crop high-resolution images, e.g. 16MP & 32MP images on Nexus 5X). * WebP compression format is not supported at the moment (choose JPEG or PNG). * Now library copies EXIF data to cropped image (size and orientation are updated). - + ### Version: 1.5 * Introduced "Freestyle" crop (you can resize crop rectangle by dragging it corners) [#32](https://github.com/Yalantis/uCrop/issues/32) @@ -140,8 +149,8 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time ### Version: 1.4 - * Introduced http(s) Uri support! - * Image is cropped in background thread. + * Introduced HTTP(s) Uri support! + * Image is cropped in a background thread. * Showing loader while Bitmap is processed (both loading and cropping). * Several bug fixes. * Couple new things to configure. @@ -149,12 +158,12 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time ### Version: 1.3 - * Image is loaded in background thread. Better error-handling for image decoding. + * Image is loaded in a background thread. Better error-handling for image decoding. * Improved EXIF data support (rotation and mirror). * Small UI updates. * Couple new things to configure. - - * Sample updated with possibility to choose custom aspect ratio. + + * Sample updated with the possibility to choose custom aspect ratio. ### Version: 1.2 @@ -170,7 +179,7 @@ Since version 2.2.7 in case if you need to change transport protocol, setup time ### Let us know! -We’d be really happy if you sent us links to your projects where you use our component. Just send an email to github@yalantis.com And do let us know if you have any questions or suggestion regarding the library. +We’d be really happy if you sent us links to your projects where you use our component. Just send an email to github@yalantis.com And do let us know if you have any questions or suggestion regarding the library. #### Apps using uCrop diff --git a/build.gradle b/build.gradle index 9bb4e6090..1a4d907ab 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } repositories { - jcenter() + mavenCentral() maven { url 'https://maven.google.com/' name 'Google' @@ -28,7 +28,7 @@ allprojects { group = GROUP repositories { - jcenter() + mavenCentral() maven { url 'https://maven.google.com/' name 'Google' diff --git a/gradle.properties b/gradle.properties index e5909cdc9..1278a05e1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=2.2.5-non-native -VERSION_CODE=25 +VERSION_NAME=2.2.8-native +VERSION_CODE=26 GROUP=com.yalantis POM_DESCRIPTION=Android Library for cropping images diff --git a/sample/build.gradle b/sample/build.gradle index cfde5de5c..95fb140fe 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 29 - buildToolsVersion '28.0.3' + compileSdkVersion 31 + buildToolsVersion '30.0.3' defaultConfig { applicationId "com.yalantis.ucrop.sample" minSdkVersion 14 - targetSdkVersion 29 + targetSdkVersion 31 versionCode 13 versionName "1.2.4" } diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index e19e943fe..414a1dcd0 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -24,7 +24,8 @@ + android:screenOrientation="portrait" + android:exported="true"> diff --git a/sample/src/main/java/com/yalantis/ucrop/sample/SampleActivity.java b/sample/src/main/java/com/yalantis/ucrop/sample/SampleActivity.java index 65069fb89..e3f4cf030 100644 --- a/sample/src/main/java/com/yalantis/ucrop/sample/SampleActivity.java +++ b/sample/src/main/java/com/yalantis/ucrop/sample/SampleActivity.java @@ -605,12 +605,14 @@ Tune everything (ノ◕ヮ◕)ノ*:・゚✧ options.setActiveControlsWidgetColor(ContextCompat.getColor(this, R.color.your_color_res)); // Aspect ratio options - options.setAspectRatioOptions(1, + options.setAspectRatioOptions(2, new AspectRatio("WOW", 1, 2), new AspectRatio("MUCH", 3, 4), new AspectRatio("RATIO", CropImageView.DEFAULT_ASPECT_RATIO, CropImageView.DEFAULT_ASPECT_RATIO), new AspectRatio("SO", 16, 9), new AspectRatio("ASPECT", 1, 1)); + options.withAspectRatio(CropImageView.DEFAULT_ASPECT_RATIO, CropImageView.DEFAULT_ASPECT_RATIO); + options.useSourceImageAspectRatio(); */ diff --git a/ucrop/build.gradle b/ucrop/build.gradle index dfefc8ec6..88782b79d 100644 --- a/ucrop/build.gradle +++ b/ucrop/build.gradle @@ -2,14 +2,14 @@ apply plugin: 'com.android.library' apply from: '../mavenpush.gradle' android { - compileSdkVersion 29 - buildToolsVersion '28.0.3' + compileSdkVersion 31 + buildToolsVersion '30.0.2' defaultConfig { minSdkVersion 14 - targetSdkVersion 29 - versionCode 25 - versionName "2.2.5-non-native" + targetSdkVersion 31 + versionCode 26 + versionName "2.2.8-native" vectorDrawables.useSupportLibrary = true } diff --git a/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java b/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java index 28deadaad..0b6dce23a 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/UCrop.java @@ -487,9 +487,9 @@ public void setFreeStyleCropEnabled(boolean enabled) { * @param aspectRatio - list of aspect ratio options that are available to user */ public void setAspectRatioOptions(int selectedByDefault, AspectRatio... aspectRatio) { - if (selectedByDefault > aspectRatio.length) { + if (selectedByDefault >= aspectRatio.length) { throw new IllegalArgumentException(String.format(Locale.US, - "Index [selectedByDefault = %d] cannot be higher than aspect ratio options count [count = %d].", + "Index [selectedByDefault = %d] (0-based) cannot be higher or equal than aspect ratio options count [count = %d].", selectedByDefault, aspectRatio.length)); } mOptionBundle.putInt(EXTRA_ASPECT_RATIO_SELECTED_BY_DEFAULT, selectedByDefault); diff --git a/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java b/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java index 03de03c77..96c4b7bd3 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/UCropActivity.java @@ -255,20 +255,21 @@ private void processOptions(@NonNull Intent intent) { mOverlayView.setCropGridStrokeWidth(intent.getIntExtra(UCrop.Options.EXTRA_CROP_GRID_STROKE_WIDTH, getResources().getDimensionPixelSize(R.dimen.ucrop_default_crop_grid_stoke_width))); // Aspect ratio options - float aspectRatioX = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_X, 0); - float aspectRatioY = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_Y, 0); + float aspectRatioX = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_X, -1); + float aspectRatioY = intent.getFloatExtra(UCrop.EXTRA_ASPECT_RATIO_Y, -1); int aspectRationSelectedByDefault = intent.getIntExtra(UCrop.Options.EXTRA_ASPECT_RATIO_SELECTED_BY_DEFAULT, 0); ArrayList aspectRatioList = intent.getParcelableArrayListExtra(UCrop.Options.EXTRA_ASPECT_RATIO_OPTIONS); - if (aspectRatioX > 0 && aspectRatioY > 0) { + if (aspectRatioX >= 0 && aspectRatioY >= 0) { if (mWrapperStateAspectRatio != null) { mWrapperStateAspectRatio.setVisibility(View.GONE); } - mGestureCropImageView.setTargetAspectRatio(aspectRatioX / aspectRatioY); + float targetAspectRatio = aspectRatioX / aspectRatioY; + mGestureCropImageView.setTargetAspectRatio(Float.isNaN(targetAspectRatio) ? CropImageView.SOURCE_IMAGE_ASPECT_RATIO : targetAspectRatio); } else if (aspectRatioList != null && aspectRationSelectedByDefault < aspectRatioList.size()) { - mGestureCropImageView.setTargetAspectRatio(aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioX() / - aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioY()); + float targetAspectRatio = aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioX() / aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioY(); + mGestureCropImageView.setTargetAspectRatio(Float.isNaN(targetAspectRatio) ? CropImageView.SOURCE_IMAGE_ASPECT_RATIO : targetAspectRatio); } else { mGestureCropImageView.setTargetAspectRatio(CropImageView.SOURCE_IMAGE_ASPECT_RATIO); } diff --git a/ucrop/src/main/java/com/yalantis/ucrop/UCropFragment.java b/ucrop/src/main/java/com/yalantis/ucrop/UCropFragment.java index 3b8ea9b87..ab7950333 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/UCropFragment.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/UCropFragment.java @@ -236,20 +236,21 @@ private void processOptions(@NonNull Bundle bundle) { mOverlayView.setCropGridStrokeWidth(bundle.getInt(UCrop.Options.EXTRA_CROP_GRID_STROKE_WIDTH, getResources().getDimensionPixelSize(R.dimen.ucrop_default_crop_grid_stoke_width))); // Aspect ratio options - float aspectRatioX = bundle.getFloat(UCrop.EXTRA_ASPECT_RATIO_X, 0); - float aspectRatioY = bundle.getFloat(UCrop.EXTRA_ASPECT_RATIO_Y, 0); + float aspectRatioX = bundle.getFloat(UCrop.EXTRA_ASPECT_RATIO_X, -1); + float aspectRatioY = bundle.getFloat(UCrop.EXTRA_ASPECT_RATIO_Y, -1); int aspectRationSelectedByDefault = bundle.getInt(UCrop.Options.EXTRA_ASPECT_RATIO_SELECTED_BY_DEFAULT, 0); ArrayList aspectRatioList = bundle.getParcelableArrayList(UCrop.Options.EXTRA_ASPECT_RATIO_OPTIONS); - if (aspectRatioX > 0 && aspectRatioY > 0) { + if (aspectRatioX >= 0 && aspectRatioY >= 0) { if (mWrapperStateAspectRatio != null) { mWrapperStateAspectRatio.setVisibility(View.GONE); } - mGestureCropImageView.setTargetAspectRatio(aspectRatioX / aspectRatioY); + float targetAspectRatio = aspectRatioX / aspectRatioY; + mGestureCropImageView.setTargetAspectRatio(Float.isNaN(targetAspectRatio) ? CropImageView.SOURCE_IMAGE_ASPECT_RATIO : targetAspectRatio); } else if (aspectRatioList != null && aspectRationSelectedByDefault < aspectRatioList.size()) { - mGestureCropImageView.setTargetAspectRatio(aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioX() / - aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioY()); + float targetAspectRatio = aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioX() / aspectRatioList.get(aspectRationSelectedByDefault).getAspectRatioY(); + mGestureCropImageView.setTargetAspectRatio(Float.isNaN(targetAspectRatio) ? CropImageView.SOURCE_IMAGE_ASPECT_RATIO : targetAspectRatio); } else { mGestureCropImageView.setTargetAspectRatio(CropImageView.SOURCE_IMAGE_ASPECT_RATIO); } diff --git a/ucrop/src/main/java/com/yalantis/ucrop/view/GestureCropImageView.java b/ucrop/src/main/java/com/yalantis/ucrop/view/GestureCropImageView.java index b0f3cff93..e3644e184 100644 --- a/ucrop/src/main/java/com/yalantis/ucrop/view/GestureCropImageView.java +++ b/ucrop/src/main/java/com/yalantis/ucrop/view/GestureCropImageView.java @@ -21,7 +21,7 @@ public class GestureCropImageView extends CropImageView { private float mMidPntX, mMidPntY; - private boolean mIsRotateEnabled = true, mIsScaleEnabled = true; + private boolean mIsRotateEnabled = true, mIsScaleEnabled = true, mIsGestureEnabled = true; private int mDoubleTapScaleSteps = 5; public GestureCropImageView(Context context) { @@ -52,6 +52,14 @@ public boolean isRotateEnabled() { return mIsRotateEnabled; } + public void setGestureEnabled(boolean gestureEnabled) { + mIsGestureEnabled = gestureEnabled; + } + + public boolean isGestureEnabled() { + return mIsGestureEnabled; + } + public void setDoubleTapScaleSteps(int doubleTapScaleSteps) { mDoubleTapScaleSteps = doubleTapScaleSteps; } @@ -77,7 +85,9 @@ public boolean onTouchEvent(MotionEvent event) { mMidPntY = (event.getY(0) + event.getY(1)) / 2; } - mGestureDetector.onTouchEvent(event); + if (mIsGestureEnabled) { + mGestureDetector.onTouchEvent(event); + } if (mIsScaleEnabled) { mScaleDetector.onTouchEvent(event); diff --git a/ucrop/src/main/res/drawable/ucrop_ic_rotate.xml b/ucrop/src/main/res/drawable/ucrop_ic_rotate.xml index 509d7b156..2c08c2285 100644 --- a/ucrop/src/main/res/drawable/ucrop_ic_rotate.xml +++ b/ucrop/src/main/res/drawable/ucrop_ic_rotate.xml @@ -7,5 +7,5 @@ + android:pathData="M 19.761,5.566 C 15.791825,0.49517195 7.1049248,0.96194642 3.7237612,6.4638227 -0.33837992,12.033745 3.3097107,20.843671 10.121424,21.908979 c 4.572019,1.06054 9.956288,-1.892196 11.2181,-6.246218 C 20.613349,15.378841 19.887175,15.09492 19.161,14.811 17.787681,18.760509 12.866024,20.703386 9.1288906,19.047063 5.9906393,17.775571 3.9999147,14.236171 4.5746701,10.893626 5.0470831,7.426033 8.1929546,4.5782223 11.692652,4.4629013 13.866935,4.33846 16.076584,5.2031434 17.571,6.791 c -0.89,0.4976667 -1.78,0.9953333 -2.67,1.493 2.321563,1.3826149 4.642896,2.765615 6.964,4.149 0.03752,-2.7019929 0.07452,-5.4039929 0.111,-8.106 -0.738333,0.413 -1.476667,0.826 -2.215,1.239 z" /> diff --git a/ucrop/src/main/res/drawable/ucrop_ic_rotate_unselected.xml b/ucrop/src/main/res/drawable/ucrop_ic_rotate_unselected.xml index 55f7a3ff9..841dc96ea 100644 --- a/ucrop/src/main/res/drawable/ucrop_ic_rotate_unselected.xml +++ b/ucrop/src/main/res/drawable/ucrop_ic_rotate_unselected.xml @@ -7,5 +7,5 @@ + android:pathData="M 19.761,5.566 C 15.791825,0.49517195 7.1049248,0.96194642 3.7237612,6.4638227 -0.33837992,12.033745 3.3097107,20.843671 10.121424,21.908979 c 4.572019,1.06054 9.956288,-1.892196 11.2181,-6.246218 C 20.613349,15.378841 19.887175,15.09492 19.161,14.811 17.787681,18.760509 12.866024,20.703386 9.1288906,19.047063 5.9906393,17.775571 3.9999147,14.236171 4.5746701,10.893626 5.0470831,7.426033 8.1929546,4.5782223 11.692652,4.4629013 13.866935,4.33846 16.076584,5.2031434 17.571,6.791 c -0.89,0.4976667 -1.78,0.9953333 -2.67,1.493 2.321563,1.3826149 4.642896,2.765615 6.964,4.149 0.03752,-2.7019929 0.07452,-5.4039929 0.111,-8.106 -0.738333,0.413 -1.476667,0.826 -2.215,1.239 z" /> diff --git a/ucrop/src/main/res/values-de/strings.xml b/ucrop/src/main/res/values-de/strings.xml index 481d25a57..8d81cea75 100644 --- a/ucrop/src/main/res/values-de/strings.xml +++ b/ucrop/src/main/res/values-de/strings.xml @@ -3,4 +3,8 @@ Foto editieren Original Zuschneiden + + Rotieren + Skalieren + Zuschneiden \ No newline at end of file diff --git a/ucrop/src/main/res/values-fa/strings.xml b/ucrop/src/main/res/values-fa/strings.xml new file mode 100644 index 000000000..f0c81a008 --- /dev/null +++ b/ucrop/src/main/res/values-fa/strings.xml @@ -0,0 +1,13 @@ + + + + اصلی + ویرایش عکس + + برش + + چرخش + اندازه + برش + + diff --git a/ucrop/src/main/res/values-in/strings.xml b/ucrop/src/main/res/values-in/strings.xml new file mode 100644 index 000000000..eddf03209 --- /dev/null +++ b/ucrop/src/main/res/values-in/strings.xml @@ -0,0 +1,12 @@ + + + Asli + Edit Foto + + Pangkas + + Memutar + Skala + Pangkas + + diff --git a/ucrop/src/main/res/values-nl/strings.xml b/ucrop/src/main/res/values-nl/strings.xml index 4570a62f8..a9ca77d13 100644 --- a/ucrop/src/main/res/values-nl/strings.xml +++ b/ucrop/src/main/res/values-nl/strings.xml @@ -2,4 +2,8 @@ Origineel Foto bewerken Bijsnijden + + Draaien + Schalen + Bijsnijden diff --git a/ucrop/src/main/res/values-pt/strings.xml b/ucrop/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..1e98d1d0c --- /dev/null +++ b/ucrop/src/main/res/values-pt/strings.xml @@ -0,0 +1,12 @@ + + + Original + Editar Foto + + Cortar + + Girar + Tamanho + Cortar + + diff --git a/ucrop/src/main/res/values-ru/strings.xml b/ucrop/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..7973c3c92 --- /dev/null +++ b/ucrop/src/main/res/values-ru/strings.xml @@ -0,0 +1,9 @@ + + + Оригинал + Повернуть + Масштабировать + Обрезать + Обрезать + Редактировать фото + diff --git a/ucrop/src/main/res/values-th/strings.xml b/ucrop/src/main/res/values-th/strings.xml new file mode 100644 index 000000000..add5b5ebe --- /dev/null +++ b/ucrop/src/main/res/values-th/strings.xml @@ -0,0 +1,12 @@ + + + เป็นต้นฉบับ + แก้ไขรูปภาพ + + พืชผล + + หมุน + ขนาด + พืชผล + + diff --git a/ucrop/src/main/res/values-tr/strings.xml b/ucrop/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..097261675 --- /dev/null +++ b/ucrop/src/main/res/values-tr/strings.xml @@ -0,0 +1,12 @@ + + + Orijinal + Fotoğrafı Düzenle + + Kırp + + Döndürme + Ölçek + Kırp + + diff --git a/ucrop/src/main/res/values-zh-rTW/strings.xml b/ucrop/src/main/res/values-zh-rTW/strings.xml index f0abcc71e..c55eb6294 100644 --- a/ucrop/src/main/res/values-zh-rTW/strings.xml +++ b/ucrop/src/main/res/values-zh-rTW/strings.xml @@ -7,5 +7,8 @@ 必須指定輸入以及輸出的 Uri 在你的 App 內覆寫顏色資源檔 (ucrop_color_toolbar_widget) 使 5.0 以前裝置正常運作 + 旋轉 + 縮放 + 裁切 diff --git a/ucrop/src/main/res/values-zh/strings.xml b/ucrop/src/main/res/values-zh/strings.xml index fb39928db..100ef14ba 100644 --- a/ucrop/src/main/res/values-zh/strings.xml +++ b/ucrop/src/main/res/values-zh/strings.xml @@ -4,5 +4,8 @@ 裁剪 裁剪 + 旋转 + 缩放 + 裁剪