UCrop图片裁剪框架
项目开源地址
1.添加依赖
implementation 'com.github.yalantis:ucrop:2.2.3'-轻型通用解决方案
implementation 'com.github.yalantis:ucrop:2.2.3-native'-获得本地代码的强大功能,以保持图像质量(+1.5MB到apk大小)
2.将UCropActivity添加到AndroidManifest.xml中
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
3.配置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
4.创建启动裁剪方法
private void startCrop(Uri uri){
UCrop.of(uri, Uri.fromFile(new File(getCacheDir()+"/uCrop.jpg")))
.withAspectRatio(16, 16)
.withMaxResultSize(128, 128)
.start(this);
}
5.重写onActivityResult方法并处理uCrop结果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case UCrop.REQUEST_CROP:
Uri resultUri = UCrop.getOutput(data);
break;
case UCrop.RESULT_ERROR:
Throwable cropError = UCrop.getError(data);
break;
}
}
6.混淆配置
-dontwarn com.yalantis.ucrop**
-keep class com.yalantis.ucrop** { *; }
-keep interface com.yalantis.ucrop** { *; }
7.注意:
destinationUri :是裁剪后图片的保存路径,裁剪后返回的Uri结果也是它
UCrop.of(sourceUri, destinationUri)
.withAspectRatio(16, 9)
.withMaxResultSize(maxWidth, maxHeight)
.start(context);
8.必看!!!!(开源项目有些问题)
如果点击这个按钮,会造成当前活动的崩溃
原因:onActivityResult方法data回传为null。
看一下UCrop.getError(data)源码:
可以看到result.getSerializableExtra(EXTRA_ERROR),result为空,所以有个空指针异常。捕获一下就行了。
UCrop.getOutput(data)同理
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
final Uri resultUri = UCrop.getOutput(data);
} else if (resultCode == UCrop.RESULT_ERROR) {
final Throwable cropError = UCrop.getError(data);
}
}