需求:将图片放入固定框中,通过对图片进行缩放和移动,将框内的部分裁剪出来
分析:传统的做法大概是这样,调用系统的图片裁剪界面
Intent intent = new Intent("com.android.camera.action.CROP");
// 判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// 给目标应用一个临时授权
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
intent.setDataAndType(data, "image/*");
// crop为true时表示显示的view可以剪裁
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁图片的宽高
intent.putExtra("outputX", 200);
intent.putExtra("outputY", 200);
uritempFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, uritempFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(intent, PHOTOZOOM);
但系统的东西~你懂的,没几样好用的,这个框没办法固定不变,用户可以随意调整它的大小,导致即使可以通过设置aspectX和aspectY来达到初始时的宽高比,但不符合我们的需求。更搞笑的是,它又支持设置outputX和outputY,即,不论用户如何调整框的大小,得到的图片大小永远是宽为outputX像素,高为outputY像素,假如我设置outputX和outputY都是200,结果裁剪框被用户拉成了1:2的比例,得到的图片就是被压扁的!试问,还有比这更垃圾的系统接口吗??
处理:自定义~参考了鸿洋的博客以及LargeImage的大图框架,整合成符合需求的代码
见https://github.com/qugengting/ImageClipDemo/tree/master
注:获取当前大图在框中的位图方法:
public Bitmap clip() {
//开启绘图缓存
setDrawingCacheEnabled(true);
//返回当前View的视图缓存
return getDrawingCache();
}
效果图:
可以缩放调整大小:
裁剪所得: