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* 图片点击事件拦截,如果返回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