package com.application.zhangshi_app_android.ui.function; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.Log; import android.view.View; import android.widget.ImageView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.android.app_base.base.adapter.BaseRVAdapter; import com.android.app_base.base.dialog.BaseDialog; import com.android.app_base.base.dialog.WaitDialog; import com.android.app_base.base.view.BaseActivity; import com.android.app_base.utils.GlideEngine; import com.application.zhangshi_app_android.BR; import com.application.zhangshi_app_android.R; import com.application.zhangshi_app_android.adapter.ElectronicFileAddAdapter; import com.application.zhangshi_app_android.bean.BannerBean; import com.application.zhangshi_app_android.databinding.ActivityImageSelectBinding; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.hjq.bar.TitleBar; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.engine.CropFileEngine; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnResultCallbackListener; import com.luck.picture.lib.style.PictureSelectorStyle; import com.luck.picture.lib.style.SelectMainStyle; import com.luck.picture.lib.style.TitleBarStyle; import com.luck.picture.lib.utils.PictureFileUtils; import com.luck.picture.lib.utils.StyleUtils; import com.yalantis.ucrop.UCrop; import com.yalantis.ucrop.UCropImageEngine; import com.yalantis.ucrop.model.AspectRatio; import java.io.File; import java.util.ArrayList; import java.util.List; /** * @author Ljj * @date 2023.07.30. 8:50 * @desc 轮播图 图片选择 Activity */ public class ImageSelectActivity extends BaseActivity { private static final String TAG = "ImageSelectActivity"; private BaseDialog mWaitDialog; private ElectronicFileAddAdapter adapter; @Override public int getLayoutId() { return R.layout.activity_image_select; } @Override public int getVariableId() { return BR.viewModel; } @Override public void initParam() { if (getIntent() != null) { viewModel.setFlag(getIntent().getIntExtra("flag", 0)); viewModel.setList((List) getIntent().getSerializableExtra("list")); } } @Override public void initView() { adapter = new ElectronicFileAddAdapter(this); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3); binding.rvImage.setLayoutManager(gridLayoutManager); binding.rvImage.setNestedScrollingEnabled(false); adapter.setShowSelectIcon(true); adapter.setItemAndAddClickListener(new ElectronicFileAddAdapter.OnItemAndAddClickListener() { @Override public void onItemClick(View itemView, int position) { //编辑状态下,点击图片才能修改是否被选中 if (viewModel.getType()) { List beans = viewModel.getListLiveData().getValue(); BannerBean updateBean = null; if (beans != null) { for (BannerBean bean : beans) { if (bean.getUrl().equals(adapter.getItem(position))) { updateBean = bean; break; } } } if (updateBean != null) { updateBean.setChoose(updateBean.getChoose()==0?1:0); viewModel.update(updateBean); } } } @Override public void onAddClick() { int chooseMode = 0; ImageFileCropEngine cropEngine = null; if (viewModel.getFlag() == 0) { chooseMode = SelectMimeType.ofImage(); cropEngine = new ImageFileCropEngine(); } else if (viewModel.getFlag() == 1) { chooseMode = SelectMimeType.ofVideo(); } PictureSelector.create(getSelfActivity()) .openGallery(chooseMode) .setImageEngine(GlideEngine.createGlideEngine()) .setCropEngine(cropEngine)// 设置裁剪引擎 .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层 .forResult(new OnResultCallbackListener() { @Override public void onResult(ArrayList result) { if (result.size() == 0) return; for (LocalMedia media : result) { if (media.isCut()){ viewModel.add(media.getCutPath()); }else { viewModel.add(media.getRealPath()); } Log.i(TAG, "文件名: " + media.getFileName()); Log.i(TAG, "是否压缩:" + media.isCompressed()); Log.i(TAG, "压缩:" + media.getCompressPath()); Log.i(TAG, "初始路径:" + media.getPath()); Log.i(TAG, "绝对路径:" + media.getRealPath()); Log.i(TAG, "是否裁剪:" + media.isCut()); Log.i(TAG, "裁剪路径:" + media.getCutPath()); Log.i(TAG, "是否开启原图:" + media.isOriginal()); Log.i(TAG, "原图路径:" + media.getOriginalPath()); Log.i(TAG, "沙盒路径:" + media.getSandboxPath()); Log.i(TAG, "水印路径:" + media.getWatermarkPath()); Log.i(TAG, "视频缩略图:" + media.getVideoThumbnailPath()); Log.i(TAG, "原始宽高: " + media.getWidth() + "x" + media.getHeight()); Log.i(TAG, "裁剪宽高: " + media.getCropImageWidth() + "x" + media.getCropImageHeight()); Log.i(TAG, "文件大小: " + PictureFileUtils.formatAccurateUnitFileSize(media.getSize())); Log.i(TAG, "文件时长: " + media.getDuration()); } } @Override public void onCancel() { } }); } }); adapter.setOnChildClickListener(R.id.iv_delete, new BaseRVAdapter.OnChildClickListener() { @Override public void onChildClick(RecyclerView recyclerView, View childView, int position) { if (viewModel.getListLiveData().getValue()!=null){ for (BannerBean bannerBean : viewModel.getListLiveData().getValue()) { if (bannerBean.getUrl().equals(adapter.getItem(position))){ viewModel.delete(bannerBean.getId()+""); break; } } } } }); binding.rvImage.setAdapter(adapter); viewModel.setType(true); binding.ivOperate.setVisibility(View.GONE); binding.ivOperate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModel.setType(Boolean.FALSE.equals(viewModel.getTypeLiveData().getValue())); } }); } @Override public void initData() { } @Override public void initLiveDataObserve() { viewModel.getListLiveData().observe(this, new Observer>() { @Override public void onChanged(List bannerBeans) { if (bannerBeans == null) return; List list = new ArrayList<>(); List chooseList = new ArrayList<>(); for (BannerBean bean : bannerBeans) { list.add(bean.getUrl()); if (bean.getChoose() == 1) { chooseList.add(bean.getUrl()); } } adapter.setData(list); adapter.addSelectedItems(chooseList); } }); viewModel.getTypeLiveData().observe(this, new Observer() { @Override public void onChanged(Boolean aBoolean) { adapter.setShowAddItem(aBoolean); adapter.setShowDeleteIcon(aBoolean); adapter.setPreview(!aBoolean); binding.ivOperate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { viewModel.setType(!aBoolean); } }); } }); } @Override protected void dialogLoading() { if (mWaitDialog == null) { mWaitDialog = new WaitDialog.Builder(this) // 消息文本可以不用填写 .setMessage("正在上传") .create(); } if (!mWaitDialog.isShowing()) { mWaitDialog.show(); } } @Override protected void dialogDismiss() { if (mWaitDialog != null && mWaitDialog.isShowing()) { mWaitDialog.dismiss(); mWaitDialog = null; } } @Override public void onLeftClick(TitleBar titleBar) { finish(); } /** * 自定义裁剪 */ private class ImageFileCropEngine implements CropFileEngine { @Override public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList dataSource, int requestCode) { UCrop.Options options = buildOptions(); UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource); uCrop.withOptions(options); uCrop.setImageEngine(new UCropImageEngine() { @Override public void loadImage(Context context, String url, ImageView imageView) { Glide.with(context).load(url).override(180, 180).into(imageView); } @Override public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) { Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { if (call != null) { call.onCall(resource); } } @Override public void onLoadCleared(@Nullable Drawable placeholder) { if (call != null) { call.onCall(null); } } }); } }); uCrop.start(fragment.requireActivity(), fragment, requestCode); } } /** * 配制UCrop,可根据需求自我扩展 * * @return */ private UCrop.Options buildOptions() { PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); UCrop.Options options = new UCrop.Options(); options.setHideBottomControls(true);//是否显示底部裁剪菜单栏 options.setFreeStyleCropEnabled(false);//裁剪框or图片拖动 options.setShowCropFrame(true);//是否显示裁剪边框 options.setShowCropGrid(true);//是否显示裁剪网格线 options.setCircleDimmedLayer(false);//是否圆形裁剪 options.withAspectRatio(16, 9);//裁剪比例 options.setAspectRatioOptions(0, new AspectRatio("16:9", 16, 9), new AspectRatio("3:2", 3, 2), new AspectRatio("4:3", 4, 3), new AspectRatio("1:1", 1, 1));//自选裁剪比例,受setHideBottomControls影响可见 options.setCropOutputPathDir(getSandboxPath());//裁剪输出路径 options.isCropDragSmoothToCenter(false);//裁剪拖动是否自动居中 options.isForbidSkipMultipleCrop(true);//是否多图裁剪时禁止跳过 options.setMaxScaleMultiplier(100);//设置最大缩放比例 if (selectorStyle != null && selectorStyle.getSelectMainStyle().getStatusBarColor() != 0) { SelectMainStyle mainStyle = selectorStyle.getSelectMainStyle(); boolean isDarkStatusBarBlack = mainStyle.isDarkStatusBarBlack(); int statusBarColor = mainStyle.getStatusBarColor(); options.isDarkStatusBarBlack(isDarkStatusBarBlack); if (StyleUtils.checkStyleValidity(statusBarColor)) { options.setStatusBarColor(statusBarColor); options.setToolbarColor(statusBarColor); } else { options.setStatusBarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); } TitleBarStyle titleBarStyle = selectorStyle.getTitleBarStyle(); if (StyleUtils.checkStyleValidity(titleBarStyle.getTitleTextColor())) { options.setToolbarWidgetColor(titleBarStyle.getTitleTextColor()); } else { options.setToolbarWidgetColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_white)); } } else { options.setStatusBarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarWidgetColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_white)); } return options; } /** * 创建自定义输出目录 * * @return */ private String getSandboxPath() { File externalFilesDir = getSelfActivity().getExternalFilesDir(""); File customFile = new File(externalFilesDir.getAbsolutePath(), "Sandbox"); if (!customFile.exists()) { customFile.mkdirs(); } return customFile.getAbsolutePath() + File.separator; } }