package com.ypx.imagepicker.presenter; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.ypx.imagepicker.adapter.PickerItemAdapter; import com.ypx.imagepicker.bean.selectconfig.BaseSelectConfig; import com.ypx.imagepicker.bean.ImageItem; import com.ypx.imagepicker.data.ProgressSceneEnum; import com.ypx.imagepicker.data.ICameraExecutor; import com.ypx.imagepicker.data.IReloadExecutor; import com.ypx.imagepicker.views.PickerUiConfig; import java.io.Serializable; import java.util.ArrayList; /** * Time: 2019/10/27 22:22 * Author:ypx * Description: 选择器交互接口类 * *

* 实现该接口可快速定制属于你自己的选择器样式。该接口支持如下操作: *

* 1.自定义图片加载逻辑和框架 * 2.自定义选择器所有ui样式 * 3.自定义提示 * 4.自定义超出最大选择数量的提示 * 5.自定义媒体库扫描和剪裁的加载框loading * 6.自定义选择器完成按钮点击事件的拦截 * 7.拦截选择器取消操作,用于弹出二次确认框 * 8.图片点击事件拦截,如果返回true,则不会执行选中操纵,如果要拦截此事件并且要执行选中 * 9.拍照点击事件拦截 *

*/ public interface IPickerPresenter extends Serializable { /** * 图片加载,在安卓10上,外部存储的图片路径只能用Uri加载,私有目录的图片可以用绝对路径加载 * 所以这个方法务必需要区分有uri和无uri的情况 * 一般媒体库直接扫描出来的图片是含有uri的,而剪裁生成的图片保存在私有目录中,因此没有uri,只有绝对路径 * 所以这里需要做一个兼容处理,例如如下代码: * *

* if (item.getUri() != null) { * Glide.with(view.getContext()).load(item.getUri().into((ImageView) view); * } else { * Glide.with(view.getContext()).load(item.path).into((ImageView) view); * } *

* * @param view imageView * @param item 图片信息 * @param size 加载尺寸 * @param isThumbnail 是否是缩略图 */ void displayImage(View view, ImageItem item, int size, boolean isThumbnail); /** * 设置自定义ui显示样式 * 该方法返回一个PickerUiConfig对象 * *

* 该对象可以配置如下信息: * 1.主题色 * 2.相关页面背景色 * 3.选择器标题栏,底部栏,item,文件夹列表item,预览页面,剪裁页面的定制 *

*

* 详细使用方法参考 (@link https://github.com/yangpeixing/YImagePicker/blob/master/YPX_ImagePicker_androidx/app/src/main/java/com/ypx/imagepickerdemo/style/WeChatPresenter.java) * * @param context 上下文 * @return PickerUiConfig */ @NonNull PickerUiConfig getUiConfig(@Nullable Context context); /** * 提示 * * @param context 上下文 * @param msg 提示文本 */ void tip(@Nullable Context context, String msg); /** * 选择超过数量限制提示 * * @param context 上下文 * @param maxCount 最大数量 */ void overMaxCountTip(@Nullable Context context, int maxCount); /** * 显示loading加载框,注意需要调用show方法 * * @param activity 启动加载框的activity * @param progressSceneEnum {@link ProgressSceneEnum} * *

* 当progressSceneEnum==当ProgressSceneEnum.loadMediaItem 时,代表在加载媒体文件时显示加载框 * 目前框架内规定,当文件夹内媒体文件少于1000时,强制不显示加载框,大于1000时才会执行此方法 *

*

* 当progressSceneEnum==当ProgressSceneEnum.crop 时,代表是剪裁页面的加载框 *

* @return DialogInterface 对象,用于关闭加载框,返回null代表不显示加载框 */ DialogInterface showProgressDialog(@Nullable Activity activity, ProgressSceneEnum progressSceneEnum); /** * 拦截选择器完成按钮点击事件 * * @param activity 当前选择器activity * @param selectedList 已选中的列表 * @return true:则拦截选择器完成回调, false,执行默认的选择器回调 */ boolean interceptPickerCompleteClick(@Nullable Activity activity, ArrayList selectedList, BaseSelectConfig selectConfig); /** * 拦截选择器取消操作,用于弹出二次确认框 * * @param activity 当前选择器页面 * @param selectedList 当前已经选择的文件列表 * @return true:则拦截选择器取消, false,不处理选择器取消操作 */ boolean interceptPickerCancel(@Nullable Activity activity, ArrayList selectedList); /** *

* 图片点击事件拦截,如果返回true,则不会执行选中操纵,如果要拦截此事件并且要执行选中 * 请调用如下代码: *

* adapter.preformCheckItem() *

*

* 此方法可以用来跳转到任意一个页面,比如自定义的预览 * * @param activity 上下文 * @param imageItem 当前图片 * @param selectImageList 当前选中列表 * @param allSetImageList 当前文件夹所有图片 * @param selectConfig 选择器配置项,如果是微信样式,则selectConfig继承自MultiSelectConfig * 如果是小红书剪裁样式,则继承自CropSelectConfig * @param adapter 当前列表适配器,用于刷新数据 * @param isClickCheckBox 是否点击item右上角的选中框 * @param reloadExecutor 刷新器 * @return 是否拦截 */ boolean interceptItemClick(@Nullable Activity activity, ImageItem imageItem, ArrayList selectImageList, ArrayList allSetImageList, BaseSelectConfig selectConfig, PickerItemAdapter adapter, boolean isClickCheckBox, @Nullable IReloadExecutor reloadExecutor); /** * 拍照点击事件拦截 * * @param activity 当前activity * @param takePhoto 拍照接口 * @return 是否拦截 */ boolean interceptCameraClick(@Nullable Activity activity, ICameraExecutor takePhoto); }