package com.ypx.imagepicker.activity.multi; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.SimpleItemAnimator; import com.ypx.imagepicker.ImagePicker; import com.ypx.imagepicker.R; import com.ypx.imagepicker.activity.PBaseLoaderFragment; import com.ypx.imagepicker.activity.PickerActivityManager; import com.ypx.imagepicker.activity.preview.MultiImagePreviewActivity; import com.ypx.imagepicker.adapter.PickerFolderAdapter; import com.ypx.imagepicker.bean.PickerItemDisableCode; import com.ypx.imagepicker.data.IReloadExecutor; import com.ypx.imagepicker.views.PickerUiConfig; import com.ypx.imagepicker.helper.PickerErrorExecutor; import com.ypx.imagepicker.adapter.PickerItemAdapter; import com.ypx.imagepicker.bean.selectconfig.BaseSelectConfig; import com.ypx.imagepicker.bean.ImageItem; import com.ypx.imagepicker.bean.PickerError; import com.ypx.imagepicker.bean.SelectMode; import com.ypx.imagepicker.bean.ImageSet; import com.ypx.imagepicker.bean.selectconfig.MultiSelectConfig; import com.ypx.imagepicker.data.OnImagePickCompleteListener; import com.ypx.imagepicker.presenter.IPickerPresenter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; 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: 2019/2/21 * 使用文档 :https://github.com/yangpeixing/YImagePicker/wiki/Documentation_3.x */ public class MultiImagePickerFragment extends PBaseLoaderFragment implements View.OnClickListener, PickerItemAdapter.OnActionResult, IReloadExecutor { private List imageSets = new ArrayList<>(); private ArrayList imageItems = new ArrayList<>(); private RecyclerView mRecyclerView; private View v_masker; private TextView mTvTime; private PickerFolderAdapter mImageSetAdapter; private RecyclerView mFolderListRecyclerView; private PickerItemAdapter mAdapter; private ImageSet currentImageSet; private FrameLayout titleBarContainer; private FrameLayout bottomBarContainer; private MultiSelectConfig selectConfig; private IPickerPresenter presenter; private PickerUiConfig uiConfig; private FragmentActivity mContext; private GridLayoutManager layoutManager; private View view; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.picker_activity_multipick, container, false); return view; } /** * 校验传递数据是否合法 */ private boolean isIntentDataValid() { Bundle bundle = getArguments(); if (bundle != null) { selectConfig = (MultiSelectConfig) bundle.getSerializable(INTENT_KEY_SELECT_CONFIG); presenter = (IPickerPresenter) bundle.getSerializable(INTENT_KEY_PRESENTER); if (presenter == null) { PickerErrorExecutor.executeError(onImagePickCompleteListener, PickerError.PRESENTER_NOT_FOUND.getCode()); return false; } if (selectConfig == null) { PickerErrorExecutor.executeError(onImagePickCompleteListener, PickerError.SELECT_CONFIG_NOT_FOUND.getCode()); return false; } return true; } else { return false; } } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mContext = getActivity(); if (isIntentDataValid()) { ImagePicker.isOriginalImage = selectConfig.isDefaultOriginal(); uiConfig = presenter.getUiConfig(getWeakActivity()); setStatusBar(); findView(); if (selectConfig.getLastImageList() != null) { selectList.addAll(selectConfig.getLastImageList()); } loadMediaSets(); refreshCompleteState(); } } private OnImagePickCompleteListener onImagePickCompleteListener; /** * 设置图片选择器完成回调 * * @param onImagePickCompleteListener 完成回调 */ public void setOnImagePickCompleteListener(@NonNull OnImagePickCompleteListener onImagePickCompleteListener) { this.onImagePickCompleteListener = onImagePickCompleteListener; } /** * 初始化控件 */ private void findView() { v_masker = view.findViewById(R.id.v_masker); mRecyclerView = view.findViewById(R.id.mRecyclerView); mFolderListRecyclerView = view.findViewById(R.id.mSetRecyclerView); mTvTime = view.findViewById(R.id.tv_time); mTvTime.setVisibility(View.GONE); titleBarContainer = view.findViewById(R.id.titleBarContainer); bottomBarContainer = view.findViewById(R.id.bottomBarContainer); initAdapters(); initUI(); setListener(); refreshCompleteState(); } private RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { if (mTvTime.getVisibility() == View.VISIBLE) { mTvTime.setVisibility(View.GONE); mTvTime.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.picker_fade_out)); } } else { if (mTvTime.getVisibility() == View.GONE) { mTvTime.setVisibility(View.VISIBLE); mTvTime.startAnimation(AnimationUtils.loadAnimation(mContext, R.anim.picker_fade_in)); } } } @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (imageItems != null) try { mTvTime.setText(imageItems.get(layoutManager.findFirstVisibleItemPosition()).getTimeFormat()); } catch (Exception ignored) { } } }; /** * 初始化UI界面 */ private void initUI() { mRecyclerView.setBackgroundColor(uiConfig.getPickerBackgroundColor()); titleBar = inflateControllerView(titleBarContainer, true, uiConfig); bottomBar = inflateControllerView(bottomBarContainer, false, uiConfig); setFolderListHeight(mFolderListRecyclerView, v_masker, false); } /** * 初始化监听 */ private void setListener() { v_masker.setOnClickListener(this); mRecyclerView.addOnScrollListener(onScrollListener); mImageSetAdapter.setFolderSelectResult(new PickerFolderAdapter.FolderSelectResult() { @Override public void folderSelected(ImageSet set, int pos) { selectImageFromSet(pos, true); } }); } /** * 初始化相关adapter */ private void initAdapters() { mFolderListRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); mImageSetAdapter = new PickerFolderAdapter(presenter, uiConfig); mFolderListRecyclerView.setAdapter(mImageSetAdapter); mImageSetAdapter.refreshData(imageSets); mAdapter = new PickerItemAdapter(selectList, new ArrayList(), selectConfig, presenter, uiConfig); mAdapter.setHasStableIds(true); mAdapter.setOnActionResult(this); layoutManager = new GridLayoutManager(mContext, selectConfig.getColumnCount()); if (mRecyclerView.getItemAnimator() instanceof SimpleItemAnimator) { ((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); mRecyclerView.getItemAnimator().setChangeDuration(0);// 通过设置动画执行时间为0来解决闪烁问题 } mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter); } /** * 选择图片文件夹 * * @param position 位置 */ private void selectImageFromSet(final int position, boolean isTransit) { currentImageSet = imageSets.get(position); if (isTransit) { toggleFolderList(); } for (ImageSet set1 : imageSets) { set1.isSelected = false; } currentImageSet.isSelected = true; mImageSetAdapter.notifyDataSetChanged(); if(currentImageSet.isAllMedia()){ if(selectConfig.isShowCameraInAllMedia()){ selectConfig.setShowCamera(true); } }else { if(selectConfig.isShowCameraInAllMedia()){ selectConfig.setShowCamera(false); } } loadMediaItemsFromSet(currentImageSet); } /** * 显示或隐藏图片文件夹选项列表 */ @Override protected void toggleFolderList() { if (mFolderListRecyclerView.getVisibility() == View.GONE) { controllerViewOnTransitImageSet(true); v_masker.setVisibility(View.VISIBLE); mFolderListRecyclerView.setVisibility(View.VISIBLE); mFolderListRecyclerView.setAnimation(AnimationUtils.loadAnimation(mContext, uiConfig.isShowFromBottom() ? R.anim.picker_show2bottom : R.anim.picker_anim_in)); } else { controllerViewOnTransitImageSet(false); v_masker.setVisibility(View.GONE); mFolderListRecyclerView.setVisibility(View.GONE); mFolderListRecyclerView.setAnimation(AnimationUtils.loadAnimation(mContext, uiConfig.isShowFromBottom() ? R.anim.picker_hide2bottom : R.anim.picker_anim_up)); } } @Override public void onClick(@NonNull View v) { if (onDoubleClick()) { return; } if (v == v_masker) { toggleFolderList(); } } @Override protected void loadMediaSetsComplete(@Nullable List imageSetList) { if (imageSetList == null || imageSetList.size() == 0 || (imageSetList.size() == 1 && imageSetList.get(0).count == 0)) { tip(getString(R.string.picker_str_tip_media_empty)); return; } this.imageSets = imageSetList; mImageSetAdapter.refreshData(imageSets); selectImageFromSet(0, false); } @Override protected void loadMediaItemsComplete(ImageSet set) { this.imageItems = set.imageItems; controllerViewOnImageSetSelected(set); mAdapter.refreshData(imageItems); } @Override protected void refreshAllVideoSet(ImageSet allVideoSet) { if (allVideoSet != null && allVideoSet.imageItems != null && allVideoSet.imageItems.size() > 0 && !imageSets.contains(allVideoSet)) { imageSets.add(1, allVideoSet); mImageSetAdapter.refreshData(imageSets); } } @Override public void onTakePhotoResult(@NonNull ImageItem imageItem) { //剪裁模式下,直接跳转剪裁页面 if (selectConfig.getSelectMode() == SelectMode.MODE_CROP) { intentCrop(imageItem); return; } //单选模式下,直接回调出去 if (selectConfig.getSelectMode() == SelectMode.MODE_SINGLE) { notifyOnSingleImagePickComplete(imageItem); return; } //将拍照返回的imageItem手动添加到第一个item上并选中 addItemInImageSets(imageSets, imageItems, imageItem); mAdapter.refreshData(imageItems); mImageSetAdapter.refreshData(imageSets); onCheckItem(imageItem, PickerItemDisableCode.NORMAL); } @Override public boolean onBackPressed() { if (mFolderListRecyclerView != null && mFolderListRecyclerView.getVisibility() == View.VISIBLE) { toggleFolderList(); return true; } if (presenter != null && presenter.interceptPickerCancel(getWeakActivity(), selectList)) { return true; } PickerErrorExecutor.executeError(onImagePickCompleteListener, PickerError.CANCEL.getCode()); return false; } @Override public void onClickItem(@NonNull ImageItem item, int position, int disableItemCode) { position = selectConfig.isShowCamera() ? position - 1 : position; //拍照 if (position < 0 && selectConfig.isShowCamera()) { if (!presenter.interceptCameraClick(getWeakActivity(), this)) { checkTakePhotoOrVideo(); } return; } //当前选中item是否不可以点击 if (interceptClickDisableItem(disableItemCode, false)) { return; } mRecyclerView.setTag(item); //剪裁模式下,直接跳转剪裁 if (selectConfig.getSelectMode() == SelectMode.MODE_CROP) { if (item.isGif() || item.isVideo()) { notifyOnSingleImagePickComplete(item); } else { intentCrop(item); } return; } //检测是否拦截了item点击 if (!mAdapter.isPreformClick() && presenter.interceptItemClick(getWeakActivity(), item, selectList, imageItems, selectConfig, mAdapter, false, this)) { return; } //如果当前是视频,且视频只能单选,且单选情况下自动回调,则执行回调 if (item.isVideo() && selectConfig.isVideoSinglePickAndAutoComplete()) { notifyOnSingleImagePickComplete(item); return; } //如果当前是单选模式,且单选模式下点击item直接回调,则直接回调 if (selectConfig.getMaxCount() <= 1 && selectConfig.isSinglePickAutoComplete()) { notifyOnSingleImagePickComplete(item); return; } //如果当前是视频,且不支持视频预览,则拦截掉点击 if (item.isVideo() && !selectConfig.isCanPreviewVideo()) { tip(getActivity().getString(R.string.picker_str_tip_cant_preview_video)); return; } //如果开启了预览,则直接跳转预览 if (selectConfig.isPreview()) { intentPreview(true, position); } } @Override public void onCheckItem(ImageItem imageItem, int disableItemCode) { if (selectConfig.getSelectMode() == SelectMode.MODE_SINGLE && selectConfig.getMaxCount() == 1 && selectList != null && selectList.size() > 0) { if (selectList.contains(imageItem)) { selectList.clear(); } else { selectList.clear(); selectList.add(imageItem); } } else { //当前选中item是否不可以点击 if (interceptClickDisableItem(disableItemCode, true)) { return; } //检测是否拦截了item点击 if (!mAdapter.isPreformClick() && presenter.interceptItemClick(getWeakActivity(), imageItem, selectList, imageItems, selectConfig, mAdapter, true, this)) { return; } //如果当前选中列表包含此item,则移除,否则添加 if (selectList.contains(imageItem)) { selectList.remove(imageItem); } else { selectList.add(imageItem); } } mAdapter.notifyDataSetChanged(); refreshCompleteState(); } /** * 跳转剪裁页面 * * @param imageItem 图片信息 */ private void intentCrop(ImageItem imageItem) { ImagePicker.crop(getActivity(), presenter, selectConfig, imageItem, new OnImagePickCompleteListener() { @Override public void onImagePickComplete(ArrayList items) { selectList.clear(); selectList.addAll(items); mAdapter.notifyDataSetChanged(); notifyPickerComplete(); } }); } /** * 跳转预览 * * @param position 默认选中的index */ @Override protected void intentPreview(boolean isClickItem, int position) { if (!isClickItem && (selectList == null || selectList.size() == 0)) { return; } MultiImagePreviewActivity.intent(getActivity(), isClickItem ? currentImageSet : null, selectList, selectConfig, presenter, position, new MultiImagePreviewActivity.PreviewResult() { @Override public void onResult(ArrayList mImageItems, boolean isCancel) { if (isCancel) { reloadPickerWithList(mImageItems); } else { selectList.clear(); selectList.addAll(mImageItems); mAdapter.notifyDataSetChanged(); notifyPickerComplete(); } } }); } /** * 刷新选中图片列表,执行回调,退出页面 */ @Override protected void notifyPickerComplete() { if (presenter == null||presenter.interceptPickerCompleteClick(getWeakActivity(), selectList, selectConfig)) { return; } if (onImagePickCompleteListener != null) { for (ImageItem imageItem : selectList) { imageItem.isOriginalImage = ImagePicker.isOriginalImage; } onImagePickCompleteListener.onImagePickComplete(selectList); } } @Override protected BaseSelectConfig getSelectConfig() { return selectConfig; } @Override protected IPickerPresenter getPresenter() { return presenter; } @Override protected PickerUiConfig getUiConfig() { return uiConfig; } @Override public void onDestroy() { uiConfig.setPickerUiProvider(null); uiConfig = null; presenter = null; super.onDestroy(); } @Override public void reloadPickerWithList(List selectedList) { selectList.clear(); selectList.addAll(selectedList); mAdapter.refreshData(imageItems); refreshCompleteState(); } }