Android图片裁剪库——cropper使用,完美解决图片填充不满布局问题

前些时间请了一个月假,远程办公,期间项目主要做图片裁剪,脑子里第一反应就是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);

你可能感兴趣的:(Android,学习笔记)