package com.ypx.imagepicker.builder; import android.app.Activity; import android.os.Bundle; import com.ypx.imagepicker.R; import com.ypx.imagepicker.activity.multi.MultiImagePickerActivity; import com.ypx.imagepicker.activity.multi.MultiImagePickerFragment; import com.ypx.imagepicker.bean.ImageItem; import com.ypx.imagepicker.bean.MimeType; import com.ypx.imagepicker.bean.PickerError; import com.ypx.imagepicker.bean.SelectMode; import com.ypx.imagepicker.bean.selectconfig.MultiSelectConfig; import com.ypx.imagepicker.data.OnImagePickCompleteListener; import com.ypx.imagepicker.helper.PickerErrorExecutor; import com.ypx.imagepicker.presenter.IPickerPresenter; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import static com.ypx.imagepicker.activity.multi.MultiImagePickerActivity.INTENT_KEY_SELECT_CONFIG; import static com.ypx.imagepicker.activity.multi.MultiImagePickerActivity.INTENT_KEY_PRESENTER; /** * Description: 多选选择器构造类 *

* Author: peixing.yang * Date: 2018/9/19 16:56 */ public class MultiPickerBuilder { private MultiSelectConfig selectConfig; private IPickerPresenter presenter; public MultiPickerBuilder(IPickerPresenter presenter) { this.presenter = presenter; this.selectConfig = new MultiSelectConfig(); } /** * @param isAutoComplete 设置单选模式下是否点击item就自动回调 */ public MultiPickerBuilder setSinglePickWithAutoComplete(boolean isAutoComplete) { selectConfig.setSinglePickAutoComplete(isAutoComplete); return this; } /** * @param selectLimit 设置最大数量限制 */ public MultiPickerBuilder setMaxCount(int selectLimit) { selectConfig.setMaxCount(selectLimit); return this; } /** * @param selectMode 设置选择模式 * {@link SelectMode} */ public MultiPickerBuilder setSelectMode(int selectMode) { selectConfig.setSelectMode(selectMode); return this; } /** * @param duration 设置视频可选择的最大时长 */ public MultiPickerBuilder setMaxVideoDuration(long duration) { this.selectConfig.setMaxVideoDuration(duration); return this; } /** * @param duration 设置视频可选择的最小时长 */ public MultiPickerBuilder setMinVideoDuration(long duration) { this.selectConfig.setMinVideoDuration(duration); return this; } /** * 设置文件加载类型 * * @param mimeTypes 文件类型数组 */ public MultiPickerBuilder mimeTypes(MimeType... mimeTypes) { if (mimeTypes == null || mimeTypes.length == 0) { return this; } Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes)); return mimeTypes(mimeTypeSet); } /** * 设置文件加载类型 * * @param mimeTypes 文件类型集合 */ public MultiPickerBuilder filterMimeTypes(Set mimeTypes) { if (mimeTypes != null && selectConfig != null && selectConfig.getMimeTypes() != null) { selectConfig.getMimeTypes().removeAll(mimeTypes); } return this; } /** * 设置需要过滤掉的文件加载类型 * * @param mimeTypes 需要过滤的文件类型数组 */ public MultiPickerBuilder filterMimeTypes(MimeType... mimeTypes) { if (mimeTypes == null || mimeTypes.length == 0) { return this; } Set mimeTypeSet = new HashSet<>(Arrays.asList(mimeTypes)); return filterMimeTypes(mimeTypeSet); } /** * 设置需要加载的文件类型 * * @param mimeTypes 需要过滤的文件类型集合 */ public MultiPickerBuilder mimeTypes(Set mimeTypes) { if (mimeTypes == null || mimeTypes.size() == 0) { return this; } selectConfig.setMimeTypes(mimeTypes); return this; } /** * @param columnCount 设置列数 */ public MultiPickerBuilder setColumnCount(int columnCount) { selectConfig.setColumnCount(columnCount); return this; } /** * @param showCamera 显示拍照item */ public MultiPickerBuilder showCamera(boolean showCamera) { selectConfig.setShowCamera(showCamera); return this; } /** * 只在全部媒体相册里展示拍照 */ public MultiPickerBuilder showCameraOnlyInAllMediaSet(boolean showCamera) { selectConfig.setShowCameraInAllMedia(showCamera); return this; } /** * @param isSinglePickImageOrVideoType 是否只能选择视频或图片 */ public MultiPickerBuilder setSinglePickImageOrVideoType(boolean isSinglePickImageOrVideoType) { selectConfig.setSinglePickImageOrVideoType(isSinglePickImageOrVideoType); return this; } /** * @param isVideoSinglePick 视频是否单选 */ public MultiPickerBuilder setVideoSinglePick(boolean isVideoSinglePick) { selectConfig.setVideoSinglePick(isVideoSinglePick); return this; } //—————————————————————— 以下为微信选择器特有的属性 —————————————————————— /** * @param isPreview 视频是否支持预览 */ public MultiPickerBuilder setPreviewVideo(boolean isPreview) { selectConfig.setCanPreviewVideo(isPreview); return this; } /** * @param isPreview 是否开启预览 */ public MultiPickerBuilder setPreview(boolean isPreview) { selectConfig.setPreview(isPreview); return this; } /** * @param isOriginal 设置是否支持原图选项 */ public MultiPickerBuilder setOriginal(boolean isOriginal) { selectConfig.setShowOriginalCheckBox(isOriginal); return this; } /** * @param isOriginal 设置原图选项默认值,true则代表默认打开原图,false代表不打开 */ public MultiPickerBuilder setDefaultOriginal(boolean isOriginal) { selectConfig.setDefaultOriginal(isOriginal); return this; } /** * @param imageList 设置屏蔽项,默认打开选择器不可选择屏蔽列表的媒体文件 * @param String or ImageItem */ public MultiPickerBuilder setShieldList(ArrayList imageList) { if (imageList == null || imageList.size() == 0) { return this; } selectConfig.setShieldImageList(transitArray(imageList)); return this; } /** * @param imageList 设置上一次选择的媒体文件,默认还原上一次选择,可取消 * @param String or ImageItem */ public MultiPickerBuilder setLastImageList(ArrayList imageList) { if (imageList == null || imageList.size() == 0) { return this; } selectConfig.setLastImageList(transitArray(imageList)); return this; } //—————————————————————— 以下为单图剪裁的属性 —————————————————————— /** * 设置剪裁最小间距,默认充满 * * @param margin 间距 */ public MultiPickerBuilder cropRectMinMargin(int margin) { selectConfig.setCropRectMargin(margin); return this; } /** * 设置剪裁模式, *

* MultiSelectConfig.STYLE_FILL:充满模式 * MultiSelectConfig.STYLE_GAP:留白模式 * * @param style MultiSelectConfig.STYLE_FILL or MultiSelectConfig.STYLE_GAP */ public MultiPickerBuilder cropStyle(int style) { selectConfig.setCropStyle(style); return this; } /** * 设置留白剪裁模式下背景色,如果设置成透明色,则默认生成png图片 * * @param color 背景色 */ public MultiPickerBuilder cropGapBackgroundColor(int color) { selectConfig.setCropGapBackgroundColor(color); return this; } /** * 设置单张图片剪裁比例 * * @param x 剪裁比例x * @param y 剪裁比例y */ public MultiPickerBuilder setCropRatio(int x, int y) { selectConfig.setCropRatio(x, y); return this; } /** * 开启圆形剪裁 */ public MultiPickerBuilder cropAsCircle() { selectConfig.setCircle(true); return this; } /** * 剪裁完成的图片是否保存在DCIM目录下 * * @param isSaveInDCIM true:存储在系统目录DCIM下 false:存储在 data/包名/files/imagePicker/ 目录下 */ public MultiPickerBuilder cropSaveInDCIM(boolean isSaveInDCIM) { selectConfig.saveInDCIM(isSaveInDCIM); return this; } /** * 单图剪裁页面,剪裁框是否在最上层 * * @param singleCropCutNeedTop 剪裁框是否在activity最顶层(会盖住所有的view) */ public MultiPickerBuilder setSingleCropCutNeedTop(boolean singleCropCutNeedTop) { selectConfig.setSingleCropCutNeedTop(singleCropCutNeedTop); return this; } //—————————————————————— 以上为单图剪裁的属性 —————————————————————— /** * @param config 选择配置 */ public MultiPickerBuilder withMultiSelectConfig(MultiSelectConfig config) { this.selectConfig = config; return this; } /** * fragment模式调用 * * @param completeListener 选择回调 * @return MultiImagePickerFragment */ public MultiImagePickerFragment pickWithFragment(OnImagePickCompleteListener completeListener) { checkVideoAndImage(); MultiImagePickerFragment mFragment = new MultiImagePickerFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(INTENT_KEY_SELECT_CONFIG, selectConfig); bundle.putSerializable(INTENT_KEY_PRESENTER, presenter); mFragment.setArguments(bundle); mFragment.setOnImagePickCompleteListener(completeListener); return mFragment; } /** * 直接开启相册选择 * * @param context 页面调用者 * @param listener 选择器选择回调 */ public void pick(Activity context, final OnImagePickCompleteListener listener) { checkVideoAndImage(); if (selectConfig.getMimeTypes() == null || selectConfig.getMimeTypes().size() == 0) { PickerErrorExecutor.executeError(listener, PickerError.MIMETYPES_EMPTY.getCode()); presenter.tip(context, context.getString(R.string.picker_str_tip_mimeTypes_empty)); return; } MultiImagePickerActivity.intent(context, selectConfig, presenter, listener); } /** * 调用单图剪裁 * * @param context 页面调用者 * @param listener 选择器剪裁回调,只支持一张图片 */ public void crop(Activity context, OnImagePickCompleteListener listener) { setMaxCount(1); filterMimeTypes(MimeType.ofVideo()); setSinglePickImageOrVideoType(false); setSinglePickWithAutoComplete(true); setVideoSinglePick(false); setShieldList(null); setLastImageList(null); setPreview(false); selectConfig.setSelectMode(SelectMode.MODE_CROP); if (selectConfig.isCircle()) { selectConfig.setCropRatio(1, 1); } if (selectConfig.getMimeTypes() == null || selectConfig.getMimeTypes().size() == 0) { PickerErrorExecutor.executeError(listener, PickerError.MIMETYPES_EMPTY.getCode()); presenter.tip(context, context.getString(R.string.picker_str_tip_mimeTypes_empty)); return; } MultiImagePickerActivity.intent(context, selectConfig, presenter, listener); } /** * 检测文件加载类型中是否全是图片或视频 */ private void checkVideoAndImage() { 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); } } } /** * 数据类型转化 */ private ArrayList transitArray(ArrayList imageList) { ArrayList items = new ArrayList<>(); for (T t : imageList) { if (t instanceof String) { ImageItem imageItem = new ImageItem(); imageItem.path = (String) t; items.add(imageItem); } else if (t instanceof ImageItem) { items.add((ImageItem) t); } else { throw new RuntimeException("ImageList item must be instanceof String or ImageItem"); } } return items; } }