早期的时候图片选择框架也是用的该作者写的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); } }
其他具体的多图片裁剪,多图片选择,具体的文档中都有介绍,比较重复,不多提了。
祝大家使用的顺利。完了。