前言
在平时开发中,经常需要实现这样的功能,拍照 - 裁剪,相册 - 裁剪。当然,系统也有裁剪的功能,但是由于机型,系统兼容性等问题,在实际开发当中,我们通常会自己进行实现。今天,就让我们一起来看看怎样实现。
这篇博客实现的功能主要有仿微信,QQ 上传图像裁剪功能,包括拍照,从相册选取。裁剪框的样式有圆形,正方形,九宫格。
主要讲解的功能点
- 使用说明
- 整体的实现思路
- 裁剪框的实现
- 图片缩放的实现,包括放大,缩小,移动,裁剪等
我们先来看看我们实现的效果图
使用说明
有两种调用方式
第一种
第一种,使用普通的 startActivityForResult 进行调用,并重写 onActivityResult 方法,在里面根据 requestCode 进行处理
1ClipImageActivity.goToClipActivity(this, uri);
2@Override
3protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
4 switch (requestCode) {
5 case REQ_CLIP_AVATAR: //剪切图片返回
6 if (resultCode == RESULT_OK) {
7 final Uri uri = intent.getData();
8 if (uri == null) {
9 return;
10 }
11 String cropImagePath = FileUtil.getRealFilePathFromUri(getApplicationContext(), uri);
12
13
14 ----
15
16}
第二种
第二种调用 ClipImageActivity.goToClipActivity 方法,结果以 callBack 回调的方式返回回来,这种看起来比较直观点,个人也比较喜欢这种方法。它的实现原理是通过空白的 fragment 处理实现的,有兴趣的可以看我这一篇博客 Android Fragment 的妙用 - 优雅地申请权限和处理 onActivityResult
1ClipImageActivity.goToClipActivity(this, uri, new ActivityResultHelper.Callback() {
2 @Override
3 public void onActivityResult(int resultCode, Intent data) {
4
5 }
6});
整体实现思路
从上面的效果图我们可以看到,裁剪功能主要包括两大块
- 裁剪框
- 图片的缩放,移动,裁剪等
因此,为了方便日后的修改,我们将裁剪框的功能单独提取出来,图片缩放功能提出出来。即裁剪框单独一个 View。
下面,让我们一起来看看裁剪框功能的实现。
裁剪框功能的实现
裁剪框主要有两层,第一层,裁剪框的实现(包括圆形,长方形,九宫格形状),第二层,在裁剪区域上面盖上一层蒙层。
蒙层
蒙层的实现我们是通过 Xfermode