前些时间请了一个月假,远程办公,期间项目主要做图片裁剪,脑子里第一反应就是github上开源裁剪库,试了排名的前几个,其中不是UI定制度太低就是裁剪效果不怎么样。当然你也可以直接intent一下系统的裁剪,可是这样的话,裁剪就完全由系统控制,UI无法定制,甚至连裁剪框大小都不可控,顺便吐槽一下只有华为手机的系统裁剪设置为正方形后居然是个圆,这特立独行,也是醉的死死的。
第一次先试用的是SimpleCropView。
github原文地址:https://github.com/IsseiAoki/SimpleCropView
值得肯定的是,这个裁剪库的UI定制度高的真是让人佩服的五体投地,所以最开始的时候最先想到它。然而这个库有一个致命的缺陷,裁剪效率太慢,三星手机3M图片可以裁剪20秒,而华为小米的部分机型直接能裁剪两分钟,这也无数次让我们的QA误认为应用卡死,苦了她每次给我计算裁剪时间。
试了几个其他的裁剪库后,最后还是选择了cropper。
原文地址:https://github.com/edmodo/cropper
这是一个挺老的裁剪库,UI定制度也不高,唯一的优点就是稳定,效率快,而且裁剪出的图片返回的是Bitmap格式,这就让其后的操作实现起来更加方便。具体的使用方法就参照其Wiki,本文主要重点在cropper使用中遇到的一些问题。
第一个问题,在集成完cropper后,你会发现有些图片在显示的时,会出现填充不满布局的情况。
造成这种情况的原因也很简单,bitmap图片也是有高度宽度的,如果bitmap的高度宽度都小于CropImageView的宽高,这样就会导致图片显示无法填充满屏幕。这也跟cropper的内部处理机制有关,我还做不到去更改它内部源码,如某个大神做到了,还请告知,先谢过。
解决方案:放大bitmap至屏幕大小,这是一个很讨巧的方法,不过很简单也很实用。
public Bitmap getBitmap(Bitmap bitmap) {
WindowManager wm = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
//先获取屏幕宽高
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
float scaleWidth = 1, scaleHeight = 1;
if (bitmap.getWidth() < width) {
//强转为float类型,
scaleWidth = (float)width / (float)bitmap.getWidth();
}
if (bitmap.getHeight() < height) {
scaleHeight = (float)height / (float)bitmap.getHeight();
}
if (scaleWidth > scaleHeight)
scaleHeight = scaleWidth;
else
scaleWidth = scaleHeight;
Matrix matrix = new Matrix();
//根据屏幕大小选择bitmap放大比例。
matrix.postScale(scaleWidth, scaleHeight);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight()
, matrix, true);
return bitmap;
}
嗯,代码实现起来也算简单。
第二个问题:没法设置裁剪框的最小宽度高度。
参考链接:https://github.com/edmodo/cropper/issues/118
ViewGroup.LayoutParams params = cropImageView.getLayoutParams();
params.width = 500;
params.height = 500;
cropImageView.setLayoutParams(params);