package com.ypx.imagepicker.builder; import android.app.Activity; import android.os.Bundle; import com.ypx.imagepicker.R; import com.ypx.imagepicker.bean.selectconfig.CropSelectConfig; import com.ypx.imagepicker.bean.MimeType; import com.ypx.imagepicker.bean.PickerError; import com.ypx.imagepicker.helper.PickerErrorExecutor; import com.ypx.imagepicker.bean.ImageCropMode; import com.ypx.imagepicker.activity.crop.MultiImageCropActivity; import com.ypx.imagepicker.activity.crop.MultiImageCropFragment; import com.ypx.imagepicker.bean.ImageItem; import com.ypx.imagepicker.data.OnImagePickCompleteListener; import com.ypx.imagepicker.presenter.IPickerPresenter; import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Description: 小红书剪裁选择器构造类 *

* Author: peixing.yang * Date: 2019/2/28 */ public class CropPickerBuilder { private CropSelectConfig selectConfig; private IPickerPresenter presenter; public CropPickerBuilder(IPickerPresenter presenter) { this.presenter = presenter; this.selectConfig = new CropSelectConfig(); } /** * @param columnCount 设置列数 */ public CropPickerBuilder setColumnCount(int columnCount) { selectConfig.setColumnCount(columnCount); return this; } /** * @param duration 设置视频可选择的最大时长 */ public CropPickerBuilder setMaxVideoDuration(long duration) { this.selectConfig.setMaxVideoDuration(duration); return this; } /** * @param duration 设置视频可选择的最小时长 */ public CropPickerBuilder setMinVideoDuration(long duration) { this.selectConfig.setMinVideoDuration(duration); return this; } /** * @param maxCount 选中数量限制 */ public CropPickerBuilder setMaxCount(int maxCount) { selectConfig.setMaxCount(maxCount); return this; } /** * @param isSinglePick 是否单选视频,如果设置为true,则点击item会走presenter的clickVideo方法, * 设置为false,则触发视频多选和预览模式 */ public CropPickerBuilder setVideoSinglePick(boolean isSinglePick) { selectConfig.setVideoSinglePick(isSinglePick); return this; } /** * @param isShowCamera 是否显示拍照item */ public CropPickerBuilder showCamera(boolean isShowCamera) { selectConfig.setShowCamera(isShowCamera); return this; } /** * 设置需要加载的文件类型 * * @param mimeTypes 需要加载的文件类型集合 */ public CropPickerBuilder mimeTypes(Set mimeTypes) { if (mimeTypes == null || mimeTypes.size() == 0) { return this; } selectConfig.setMimeTypes(mimeTypes); return this; } /** * 设置文件加载类型 * * @param mimeTypes 文件类型数组 */ public CropPickerBuilder mimeTypes(MimeType... mimeTypes) { if (mimeTypes == null || mimeTypes.length == 0) { return this; } Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes)); return mimeTypes(mimeTypeSet); } /** * 设置需要过滤掉的文件类型 * * @param mimeTypes 需要过滤的文件类型数组 */ public CropPickerBuilder filterMimeTypes(MimeType... mimeTypes) { if (mimeTypes == null || mimeTypes.length == 0) { return this; } Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes)); return filterMimeTypes(mimeTypeSet); } /** * 设置需要过滤掉的文件类型 * * @param mimeTypes 文件类型集合 */ public CropPickerBuilder filterMimeTypes(Set mimeTypes) { selectConfig.getMimeTypes().removeAll(mimeTypes); return this; } /** * @param isAutoComplete 设置单选模式下是否点击item就自动回调 */ public CropPickerBuilder setSinglePickWithAutoComplete(boolean isAutoComplete) { selectConfig.setSinglePickAutoComplete(isAutoComplete); return this; } //--------------- 以下是小红书剪裁特有属性 ------------------------------------- /** * 在没有指定setFirstImageItem时,使用这个方法传入当前的第一张图片的宽高信息, * 会生成一个新的FirstImageItem,其剪裁模式根据图片宽高决定,如果已经指定了FirstImageItem,则该方法无效 * * @param width 第一张图片的宽 * @param height 第一张图片的高 */ public CropPickerBuilder setFirstImageItemSize(int width, int height) { if (width == 0 || height == 0 || selectConfig.hasFirstImageItem()) { return this; } ImageItem firstImageItem = new ImageItem(); firstImageItem.setVideo(false); firstImageItem.width = width; firstImageItem.height = height; if (Math.abs(width - height) < 5) { firstImageItem.setCropMode(ImageCropMode.CropViewScale_FULL); } else { firstImageItem.setCropMode(ImageCropMode.CropViewScale_FIT); } return setFirstImageItem(firstImageItem); } /** * 强制指定留白模式,即一打开只有留白模式 * * @param isAssignGap 指定留白 */ public CropPickerBuilder assignGapState(boolean isAssignGap) { selectConfig.setAssignGapState(isAssignGap); if (isAssignGap) { setFirstImageItemSize(1, 1); } return this; } /** * @param firstImageItem 设置之前选择的第一个item,用于指定默认剪裁模式,如果当前item是图片, * 则强制所有图片剪裁模式为当前图片比例,如果当前item是视频, * 则强制只能选择视频 */ public CropPickerBuilder setFirstImageItem(ImageItem firstImageItem) { if (firstImageItem != null) { if (firstImageItem.isVideo() || selectConfig.hasFirstImageItem()) { return this; } if ((firstImageItem.width > 0 && firstImageItem.height > 0)) { selectConfig.setFirstImageItem(firstImageItem); } } return this; } //--------------- 以上是小红书剪裁特有属性 ------------------------------------- /** * @param selectConfig 选择配置项 */ public CropPickerBuilder withSelectConfig(CropSelectConfig selectConfig) { this.selectConfig = selectConfig; return this; } /** * 页面直接调用剪裁器 * * @param activity 调用者 * @param listener 图片视频选择回调 */ public void pick(Activity activity, final OnImagePickCompleteListener listener) { checkVideoAndImage(); if (selectConfig.getMimeTypes() == null || selectConfig.getMimeTypes().size() == 0) { PickerErrorExecutor.executeError(listener, PickerError.MIMETYPES_EMPTY.getCode()); presenter.tip(activity, activity.getString(R.string.picker_str_tip_mimeTypes_empty)); return; } MultiImageCropActivity.intent(activity, presenter, selectConfig, listener); } /** * fragment构建 * * @param imageListener 图片视频选择回调 */ public MultiImageCropFragment pickWithFragment(OnImagePickCompleteListener imageListener) { checkVideoAndImage(); MultiImageCropFragment mFragment = new MultiImageCropFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(MultiImageCropActivity.INTENT_KEY_DATA_PRESENTER, presenter); bundle.putSerializable(MultiImageCropActivity.INTENT_KEY_SELECT_CONFIG, selectConfig); mFragment.setArguments(bundle); mFragment.setOnImagePickCompleteListener(imageListener); return mFragment; } /** * 检测文件加载类型中是否全是图片或视频 */ private void checkVideoAndImage() { selectConfig.setSinglePickImageOrVideoType(true); if (selectConfig == null) { return; } selectConfig.setShowVideo(false); selectConfig.setShowImage(false); for (MimeType mimeType : selectConfig.getMimeTypes()) { if (MimeType.ofVideo().contains(mimeType)) { selectConfig.setShowVideo(true); } if (MimeType.ofImage().contains(mimeType)) { selectConfig.setShowImage(true); } } } }