在我们开发项目的时候,经常会涉及到头像上传和裁剪,针对这一需求我综合开源项目知乎的Matisse和国外的框架ucrop,实现了图片选择拍照和图片裁剪。
先看一下效果图
实现的方法
1、图片选择器的配置部分
Matisse.from(MainActivity.this)
.choose(MimeType.of(MimeType.JPEG, MimeType.PNG, MimeType.GIF))//照片视频全部显示MimeType.allOf()
.countable(true)//true:选中后显示数字;false:选中后显示对号
.maxSelectable(1)//最大选择数量为9
//.addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K))
.gridExpectedSize(getResources().getDimensionPixelSize(R.dimen.grid_expected_size))//图片显示表格的大小
.restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)//图像选择和预览活动所需的方向
.thumbnailScale(0.85f)//缩放比例
.theme(R.style.Matisse_Zhihu)//主题 暗色主题 R.style.Matisse_Dracula
.imageEngine(new MyGlideEngine())//图片加载方式,Glide4需要自定义实现
.capture(true) //是否提供拍照功能,兼容7.0系统需要下面的配置
//参数1 true表示拍照存储在共有目录,false表示存储在私有目录;参数2与 AndroidManifest中authorities值相同,用于适配7.0系统 必须设置
.captureStrategy(new CaptureStrategy(false, "com.tieshu.matissecrop.FileProvider"))//存储到哪里
.forResult(PicCrop.REQUEST_SELECT_PICTURE);//请求码
2、图片裁剪的配置
private static void startCropActivity(Activity context, Uri sourceUri) {
Uri mDestinationUri = buildUri(context);
UCrop uCrop = UCrop.of(sourceUri, mDestinationUri);
uCrop.withAspectRatio(config.aspectRatioX, config.aspectRatioY);
uCrop.withMaxResultSize(config.maxWidth, config.maxHeight);
UCrop.Options options = new UCrop.Options();
options.setCompressionFormat(Bitmap.CompressFormat.JPEG);
options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.NONE, UCropActivity.NONE);
options.setCompressionQuality(config.quality);
options.setCircleDimmedLayer(config.isOval);
options.setShowCropGrid(config.showGridLine);
options.setHideBottomControls(config.hideBottomControls);
options.setShowCropFrame(config.showOutLine);
options.setToolbarTitle("自定义裁剪");
options.setToolbarWidgetColor(Color.WHITE);
options.setToolbarColor(Color.BLUE);
options.setStatusBarColor(Color.BLUE);
uCrop.withOptions(options);
uCrop.start(context);
}
3、在onActivityResult 处理图片
if (resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_SELECT_PICTURE) {
//第一次,选择图片后返回
Uri selectedUri = null;
if (data != null) {
selectedUri = Matisse.obtainResult(data).get(0);
}
if (selectedUri != null) {
startCropActivity(context, selectedUri);
} else {
Toast.makeText(context, "Cannot retrieve selected image", Toast.LENGTH_SHORT).show();
}
} else if (requestCode == UCrop.REQUEST_CROP) {
//第二次返回,图片已经剪切好
Uri finalUri = UCrop.getOutput(data);
cropHandler.handleCropResult(finalUri, config.tag);
} else if (requestCode == REQUEST_CAMERA) {
//第一次,拍照后返回,因为设置了MediaStore.EXTRA_OUTPUT,所以data为null,数据直接就在uri中
startCropActivity(context, uri);
}
}
if (resultCode == UCrop.RESULT_ERROR) {
cropHandler.handleCropError(data);
}