图片选择裁剪框架 - RxGalleryFinal

早期的时候图片选择框架也是用的该作者写的GalleryFinal,功能也是比较强大,按照说明接入,基本没太多问题。

随着项目的更新,现在的图片选择,裁剪,越来越倾向于将图片裁剪为正方形。原来的GalleryFinal,是支持各种形状拉伸裁剪的。有时候用户上传了一个长条的图片作为头像就比较难适配了。后来看了作者更新了该框架,就是现在介绍的这个RxGalleryFinal。

在接入该框架之前,试玩了一波微信和支付宝的头像上传,也都已经变成了裁剪成正方形。具体自己玩一下,不介绍了,反正紧跟大厂的效果。然后果断接入了该框架尝试。接入方式也很简单,直接下载来当成lib目录即可。同时demo里面还写有SimpleRxGalleryFinal,为我们接入该框架更方便了。

接入也都挺简单,下面就稍微介绍一下一些用法。

这里重点说明一下,无论以下那种方式,我们都需要获取手机存储权限。直接使用以前介绍过的rx来做权限请求会很方便。

  • 图片裁剪 

官方提供的demo 里面,将许多方法都放在了MainActivity里面,我们可以稍微封装一下,可以将很多初始化的功能,封装到内部类中,而不是通过代码。代码可以简单的写一个init以及将裁剪后的结果回调出来。直接调用openImageSelectRadioMethod。

instance
        .openGalleryRadioImgDefault(
                new RxBusResultDisposable() {
                    @Override
                    protected void onEvent(ImageRadioResultEvent imageRadioResultEvent) throws Exception {
                        Logger.i("只要选择图片就会触发");
                    }
                })
        .onCropImageResult(
                new IRadioImageCheckedListener() {
                    @Override
                    public void cropAfter(Object t) {
                        Logger.i("裁剪完成");
                    }

                    @Override
                    public boolean isActivityFinish() {
                        Logger.i("返回false不关闭,返回true则为关闭");
                        return true;
                    }
                });

很容易就理解意思。就说明一个地方openGalleryRadioImgDefault。可以设置一些裁剪的界面。比如设置图片加载框架。设置是否支持拍照。是否支持旋转裁剪等。具体看内部的api即可。以下是我的设置,作为参考。

rxGalleryFinal
        .image()
        .radio()
        .crop()
        .hideCamera()
        .cropWithAspectRatio(1, 1)
        .imageLoader(ImageLoaderType.FRESCO)
        .subscribe(rxBusResultDisposable)
        .cropHideBottomControls(true)
        .openGallery();
  • 拍照裁剪

demo中也有说明,直接调用这个拍照并裁剪的功能。

SimpleRxGalleryFinal.get().init(
        new SimpleRxGalleryFinal.RxGalleryFinalCropListener() {
            @NonNull
            @Override
            public Activity getSimpleActivity() {
                return MainActivity.this;
            }

            @Override
            public void onCropCancel() {
                Toast.makeText(getSimpleActivity(), "裁剪被取消", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCropSuccess(@Nullable Uri uri) {
                Toast.makeText(getSimpleActivity(), "裁剪成功:" + uri, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onCropError(@NonNull String errorMessage) {
                Toast.makeText(getSimpleActivity(), errorMessage, Toast.LENGTH_SHORT).show();
            }
        }
).openCamera();

这边说明一下,这个地方onCropSuccess是裁剪以后的回调。拍照以后的回调,是回调到onActivityResult里面。查看源码可以看到这个 case

case Activity.RESULT_OK:
    switch (requestCode) {
        case TYPE_CAMERA:
            notifyImageToCamera(listener.getSimpleActivity(), imagePath);
            UCrop of = UCrop.of(imagePath, Uri.fromFile(getDiskCacheDir()));
            of.start(listener.getSimpleActivity());
            break;
        case UCrop.REQUEST_CROP:
            listener.onCropSuccess(UCrop.getOutput(data));
            break;
    }
    break;

这里面实际是拿着我们拍完的照片,再去调用图片的裁剪。这里说明的原因在于,如果此时要去设计裁剪框的界面,开放某些功能等,就没有能直接调用到api。

我这边自己看了以后,创建一个UCrop.Options options = new UCrop.Options(); 设置属性的实例。

然后可以把这个实例设置给UCrop。这里是我的相关设置。需要什么设置什么。其实我这边当时主要是为了统一裁剪界面的风格,以及隐藏旋转的功能。

UCrop.Options options = new UCrop.Options();
options.setHideBottomControls(true);
options.setToolbarTitle(listener.getSimpleActivity().getString("图片裁剪"));
options.setStatusBarColor(Color.parseColor("#000000"));
options.setToolbarColor(Color.parseColor("#000000"));
UCrop of = UCrop.of(imagePath, Uri.fromFile(getDiskCacheDir()))
        .withAspectRatio(1, 1).withOptions(options);
of.start(listener.getSimpleActivity());
notifyImageToCamera(listener.getSimpleActivity(), imagePath);

到了这里,可以看到裁剪后的图片会出现在我们的相册中。!!!!!此处记得修改源码!!!!!!

一般应用这种裁剪的中间图是不会暴露给用户的。所以需要将这个文件夹设置成隐藏文件夹,或者也可以试试看删除等操作。看你们具体的业务需求。当然也有部分就是图片裁剪的功能,那就忽略以下内容!!!我们是裁剪以后直接上传头像,裁剪以后上传截图等。修改的目录在MediaGridFragment的onLoadFile方法中!当然也可以自己设置其他路径。

public void onLoadFile() {
    //没有的话就默认路径
    if (getImageStoreDirByFile() == null && getImageStoreDirByStr() == null) {
        mImageStoreDir = new File(Environment.getExternalStorageDirectory(), "/DCIM/IMMQY/"); 
    // 修改此处的目录"/xnm/.crop_thumbnail/"
        setImageStoreCropDir(mImageStoreDir);
    }
    if (!mImageStoreDir.exists()) {
        mImageStoreDir.mkdirs();
    }
    if (getImageStoreCropDirByFile() == null && getImageStoreCropDirByStr() == null) {
        mImageStoreCropDir = new File(mImageStoreDir, "crop");
        if (!mImageStoreCropDir.exists()) {
            mImageStoreCropDir.mkdirs();
        }
        setImageStoreCropDir(mImageStoreCropDir);
    }
}

其他具体的多图片裁剪,多图片选择,具体的文档中都有介绍,比较重复,不多提了。

祝大家使用的顺利。完了。

你可能感兴趣的:(图片选择裁剪框架 - RxGalleryFinal)