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
* 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