场景
- 拍照->裁剪->显示
- 相册选->裁剪->显示
原生
/**
* 图裁剪
*
* @param uri 统一资源标识符
*/
public void imageCrop(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 宽高比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 裁剪图宽高
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);
startActivityForResult(intent, REQUEST_CROP);
}
/**
* 存裁剪后图至本地并回调至画板
*
* @param bitmap bitmap
*/
private void dealWithBitmap(Bitmap bitmap) {
if (bitmap != null) {
String sdStatus = Environment.getExternalStorageState();
// SDCard可用否
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) {
return;
}
FileOutputStream b = null;
File file = new File(value.Folder.WHITE_BOARD_PICTURE_CROP);
if (!file.exists()) {
file.mkdirs();
}
// 图名
String fileName = value.Folder.WHITE_BOARD_PICTURE_CROP + UUID.randomUUID() + ".jpg";
try {
b = new FileOutputStream(fileName);
// 写数据到文件
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
// 关流
if (b != null) {
b.flush();
b.close();
}
if (callback != null) {
File imgFile = new File(fileName);
callback.onCameraShot(imgFile);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
crop
- ProjectGradle
maven { url "https://jitpack.io" }
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } /*6.0动申权限*/ } }
- ModuleGradle
compile 'com.github.jokermonn:permissions4m:2.1.1-lib'/*6.0动申权限*/ annotationProcessor 'com.github.jokermonn:permissions4m:2.1.1-processor'/*6.0动申权限*/ compile('com.kevin:crop:1.0.2') {/*图像剪切*/ exclude group: 'com.android.support', module: 'appcompat-v7'/*引support:appcompat-v7可加该句*/ }
uCrop
原生
public static String PRACTICE_IN_CLASS_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/PracticeInClass/CropPicture/";
File outDir = new File(Folder.PRACTICE_IN_CLASS_CROP_PICTURE);
if (!outDir.exists()) {
outDir.mkdirs();
}
File outFile = new File(outDir, System.currentTimeMillis() + ".png");
Uri destination = Uri.fromFile(outFile);
UCrop.of(Uri.fromFile(new File(list.get(0))), destinationUri)
.withAspectRatio(16, 9)
.withMaxResultSize(360, 180)
.start(this);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case UCrop.REQUEST_CROP:
if (data != null) {
GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
}
break;
case UCrop.RESULT_ERROR:
if (data != null) {
Throwable throwable = UCrop.getError(data);
if (throwable != null) {
LogUtils.e(throwable.getMessage());
}
}
break;
default:
break;
}
}
}
封装
CropExecutor
package widget.ucrop;
import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import com.xalikai.bnmdteacherend.R;
import com.yalantis.ucrop.UCrop;
import java.io.File;
/**
* Created on 2019/3/19.
*
* @author 郑少鹏
* @desc 裁剪执行者
*/
public class CropExecutor {
/**
* 活动中裁剪
*
* @param activity 上下文
* @param sourcePath 需裁剪图路径
* @param destinationPath 目标路径
* @param maxWidth 最大宽
* @param maxHeight 最大高
*/
public static void uCropInActivity(Activity activity, String sourcePath, String destinationPath, int maxWidth, int maxHeight) {
File outDir = new File(destinationPath);
if (!outDir.exists()) {
outDir.mkdirs();
}
File outFile = new File(outDir, System.currentTimeMillis() + ".png");
Uri destinationUri = Uri.fromFile(outFile);
UCrop.of(Uri.fromFile(new File(sourcePath)), destinationUri)
.withAspectRatio(16, 9)
.withMaxResultSize(maxWidth, maxHeight)
.withOptions(options(activity))
.start(activity);
}
/**
* 碎片中裁剪
*
* @param context 上下文
* @param fragment 碎片
* @param sourcePath 需裁剪图路径
* @param destinationPath 目标路径
* @param maxWidth 最大宽
* @param maxHeight 最大高
*/
public static void uCropInFragment(Context context, Fragment fragment, String sourcePath, String destinationPath, int maxWidth, int maxHeight) {
File outDir = new File(destinationPath);
if (!outDir.exists()) {
outDir.mkdirs();
}
File outFile = new File(outDir, System.currentTimeMillis() + ".png");
Uri destinationUri = Uri.fromFile(outFile);
UCrop.of(Uri.fromFile(new File(sourcePath)), destinationUri)
.withAspectRatio(16, 9)
.withMaxResultSize(maxWidth, maxHeight)
.withOptions(options(context))
.start(context, fragment);
}
/**
* 设置
* <p>
* 裁剪图操作手势
* options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
* 隐底部容器否(默显)
* options.setHideBottomControls(false);
* 调裁剪框否
* options.setFreeStyleCropEnabled(true);
* 显网格否
* options.setShowCropGrid(true);
* 网格色
* options.setCropGridColor(ContextCompat.getColor(context, R.color.colorPrimary));
*
* @param context 上下文
* @return UCrop.Options
*/
public static UCrop.Options options(Context context) {
// 初始UCrop配置
UCrop.Options options = new UCrop.Options();
// Toolbar色
options.setToolbarColor(ActivityCompat.getColor(context, R.color.colorPrimary));
// 状态栏色
options.setStatusBarColor(ActivityCompat.getColor(context, R.color.colorPrimary));
return options;
}
}
主代码(Activity)
public static String PRACTICE_IN_CLASS_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/PracticeInClass/CropPicture/";
CropExecutor.uCropInActivity(this, list.get(0), Folder.PRACTICE_IN_CLASS_CROP_PICTURE, 360, 180);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case UCrop.REQUEST_CROP:
if (data != null) {
GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
}
break;
case UCrop.RESULT_ERROR:
if (data != null) {
Throwable throwable = UCrop.getError(data);
if (throwable != null) {
LogUtils.e(throwable.getMessage());
}
}
break;
default:
break;
}
}
}
主代码(Fragment)
public static String COURSE_RESOURCE_UPLOAD_CROP_PICTURE = Environment.getExternalStorageDirectory().getAbsolutePath() + "/bte/CourseResourceUpload/CropPicture/";
CropExecutor.uCropInFragment(getContext(), this, list.get(0), Folder.COURSE_RESOURCE_UPLOAD_CROP_PICTURE, 360, 180);
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case UCrop.REQUEST_CROP:
if (data != null) {
GlideLoader.displayByUriPlaceHolderColor(this, UCrop.getOutput(data), R.color.transparent, iv);
}
break;
case UCrop.RESULT_ERROR:
if (data != null) {
Throwable throwable = UCrop.getError(data);
if (throwable != null) {
LogUtils.e(throwable.getMessage());
}
}
break;
default:
break;
}
}
}