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<ActivityImageSelectBinding, ImageSelectActivityViewModel> {
|
|
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<BannerBean>) 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<BannerBean> 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);
|
|
if (updateBean.getChoose() == 1) {
|
if (viewModel.getFlag() == 1) {//如果是视频,只能有一个选中,需要把其他的选中的取消
|
for (BannerBean bean : beans) {
|
if (bean != updateBean && bean.getChoose() == 1) {
|
bean.setChoose(0);
|
viewModel.update(bean);
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
@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<LocalMedia>() {
|
@Override
|
public void onResult(ArrayList<LocalMedia> 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);
|
|
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<List<BannerBean>>() {
|
@Override
|
public void onChanged(List<BannerBean> bannerBeans) {
|
if (bannerBeans == null) return;
|
List<String> list = new ArrayList<>();
|
List<String> 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<Boolean>() {
|
@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<String> 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<Bitmap> call) {
|
Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget<Bitmap>() {
|
@Override
|
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> 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;
|
}
|
}
|