package com.luck.pictureselector; import android.Manifest; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; import com.luck.picture.lib.PictureSelector; import com.luck.picture.lib.animators.AnimationType; import com.luck.picture.lib.broadcast.BroadcastAction; import com.luck.picture.lib.broadcast.BroadcastManager; import com.luck.picture.lib.config.PictureConfig; import com.luck.picture.lib.config.PictureMimeType; import com.luck.picture.lib.config.PictureSelectionConfig; import com.luck.picture.lib.decoration.GridSpacingItemDecoration; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.language.LanguageConfig; import com.luck.picture.lib.listener.OnCustomCameraInterfaceListener; import com.luck.picture.lib.listener.OnCustomImagePreviewCallback; import com.luck.picture.lib.listener.OnResultCallbackListener; import com.luck.picture.lib.listener.OnVideoSelectedPlayCallback; import com.luck.picture.lib.permissions.PermissionChecker; import com.luck.picture.lib.style.PictureCropParameterStyle; import com.luck.picture.lib.style.PictureParameterStyle; import com.luck.picture.lib.style.PictureWindowAnimationStyle; import com.luck.picture.lib.tools.PictureFileUtils; import com.luck.picture.lib.tools.ScreenUtils; import com.luck.picture.lib.tools.SdkVersionUtils; import com.luck.picture.lib.tools.ToastUtils; import com.luck.picture.lib.tools.ValueOf; import com.luck.pictureselector.adapter.GridImageAdapter; import com.luck.pictureselector.listener.DragListener; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author:luck * @data:2019/12/20 晚上 23:12 * @描述: Demo */ public class MainActivity extends AppCompatActivity implements View.OnClickListener, RadioGroup.OnCheckedChangeListener, CompoundButton.OnCheckedChangeListener { private final static String TAG = MainActivity.class.getSimpleName(); private GridImageAdapter mAdapter; private int maxSelectNum = 9; private TextView tv_select_num; private TextView tv_original_tips; private TextView tvDeleteText; private RadioGroup rgb_crop; private int aspect_ratio_x, aspect_ratio_y; private CheckBox cb_voice, cb_choose_mode, cb_isCamera, cb_isGif, cb_preview_img, cb_preview_video, cb_crop, cb_compress, cb_mode, cb_hide, cb_crop_circular, cb_styleCrop, cb_showCropGrid, cb_showCropFrame, cb_preview_audio, cb_original, cb_single_back, cb_custom_camera, cbPage, cbEnabledMask; private int themeId; private int chooseMode = PictureMimeType.ofAll(); private boolean isWeChatStyle; private boolean isUpward; private boolean needScaleBig = true; private boolean needScaleSmall = true; private int language = -1; private PictureParameterStyle mPictureParameterStyle; private PictureCropParameterStyle mCropParameterStyle; private PictureWindowAnimationStyle mWindowAnimationStyle; private ItemTouchHelper mItemTouchHelper; private DragListener mDragListener; private int animationMode = AnimationType.DEFAULT_ANIMATION; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { // 被回收 } else { clearCache(); } setContentView(R.layout.activity_main); themeId = R.style.picture_default_style; getDefaultStyle(); ImageView minus = findViewById(R.id.minus); ImageView plus = findViewById(R.id.plus); tvDeleteText = findViewById(R.id.tv_delete_text); tv_select_num = findViewById(R.id.tv_select_num); tv_original_tips = findViewById(R.id.tv_original_tips); rgb_crop = findViewById(R.id.rgb_crop); RadioGroup rgb_style = findViewById(R.id.rgb_style); RadioGroup rgb_animation = findViewById(R.id.rgb_animation); RadioGroup rgb_list_anim = findViewById(R.id.rgb_list_anim); RadioGroup rgb_photo_mode = findViewById(R.id.rgb_photo_mode); RadioGroup rgb_language = findViewById(R.id.rgb_language); cb_voice = findViewById(R.id.cb_voice); cb_choose_mode = findViewById(R.id.cb_choose_mode); cb_isCamera = findViewById(R.id.cb_isCamera); cb_isGif = findViewById(R.id.cb_isGif); cb_preview_img = findViewById(R.id.cb_preview_img); cb_preview_video = findViewById(R.id.cb_preview_video); cb_crop = findViewById(R.id.cb_crop); cbPage = findViewById(R.id.cbPage); cbEnabledMask = findViewById(R.id.cbEnabledMask); cb_styleCrop = findViewById(R.id.cb_styleCrop); cb_compress = findViewById(R.id.cb_compress); cb_mode = findViewById(R.id.cb_mode); cb_showCropGrid = findViewById(R.id.cb_showCropGrid); cb_showCropFrame = findViewById(R.id.cb_showCropFrame); cb_preview_audio = findViewById(R.id.cb_preview_audio); cb_original = findViewById(R.id.cb_original); cb_single_back = findViewById(R.id.cb_single_back); cb_custom_camera = findViewById(R.id.cb_custom_camera); cb_hide = findViewById(R.id.cb_hide); cb_crop_circular = findViewById(R.id.cb_crop_circular); rgb_crop.setOnCheckedChangeListener(this); rgb_style.setOnCheckedChangeListener(this); rgb_animation.setOnCheckedChangeListener(this); rgb_list_anim.setOnCheckedChangeListener(this); rgb_photo_mode.setOnCheckedChangeListener(this); rgb_language.setOnCheckedChangeListener(this); RecyclerView mRecyclerView = findViewById(R.id.recycler); ImageView left_back = findViewById(R.id.left_back); left_back.setOnClickListener(this); minus.setOnClickListener(this); plus.setOnClickListener(this); cb_crop.setOnCheckedChangeListener(this); cb_crop_circular.setOnCheckedChangeListener(this); cb_compress.setOnCheckedChangeListener(this); tv_select_num.setText(ValueOf.toString(maxSelectNum)); FullyGridLayoutManager manager = new FullyGridLayoutManager(this, 4, GridLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(manager); mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(4, ScreenUtils.dip2px(this, 8), false)); mAdapter = new GridImageAdapter(getContext(), onAddPicClickListener); if (savedInstanceState != null && savedInstanceState.getParcelableArrayList("selectorList") != null) { mAdapter.setList(savedInstanceState.getParcelableArrayList("selectorList")); } // List<LocalMedia> list = new ArrayList<>(); // LocalMedia m = new LocalMedia(); // m.setPath("https://wx1.sinaimg.cn/mw690/006e0i7xly1gaxqq5m7t8j31311g2ao6.jpg"); // LocalMedia m1 = new LocalMedia(); // m1.setPath("https://ww1.sinaimg.cn/bmiddle/bcd10523ly1g96mg4sfhag20c806wu0x.gif"); // list.add(m); // list.add(m1); // mAdapter.setList(list); mAdapter.setSelectMax(maxSelectNum); mRecyclerView.setAdapter(mAdapter); cb_original.setOnCheckedChangeListener((buttonView, isChecked) -> tv_original_tips.setVisibility(isChecked ? View.VISIBLE : View.GONE)); cb_choose_mode.setOnCheckedChangeListener((buttonView, isChecked) -> { cb_single_back.setVisibility(isChecked ? View.GONE : View.VISIBLE); cb_single_back.setChecked(!isChecked && cb_single_back.isChecked()); }); mAdapter.setOnItemClickListener((v, position) -> { List<LocalMedia> selectList = mAdapter.getData(); if (selectList.size() > 0) { LocalMedia media = selectList.get(position); String mimeType = media.getMimeType(); int mediaType = PictureMimeType.getMimeType(mimeType); switch (mediaType) { case PictureConfig.TYPE_VIDEO: // 预览视频 PictureSelector.create(MainActivity.this) .themeStyle(R.style.picture_default_style) .setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题 .externalPictureVideo(TextUtils.isEmpty(media.getAndroidQToPath()) ? media.getPath() : media.getAndroidQToPath()); break; case PictureConfig.TYPE_AUDIO: // 预览音频 PictureSelector.create(MainActivity.this) .externalPictureAudio(PictureMimeType.isContent(media.getPath()) ? media.getAndroidQToPath() : media.getPath()); break; default: // 预览图片 可自定长按保存路径 // PictureWindowAnimationStyle animationStyle = new PictureWindowAnimationStyle(); // animationStyle.activityPreviewEnterAnimation = R.anim.picture_anim_up_in; // animationStyle.activityPreviewExitAnimation = R.anim.picture_anim_down_out; PictureSelector.create(MainActivity.this) .themeStyle(R.style.picture_default_style) // xml设置主题 .setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题 //.setPictureWindowAnimationStyle(animationStyle)// 自定义页面启动动画 .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)// 设置相册Activity方向,不设置默认使用系统 .isNotPreviewDownload(true)// 预览图片长按是否可以下载 //.bindCustomPlayVideoCallback(new MyVideoSelectedPlayCallback(getContext()))// 自定义播放回调控制,用户可以使用自己的视频播放界面 .imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项 .openExternalPreview(position, selectList); break; } } }); mAdapter.setItemLongClickListener((holder, position, v) -> { //如果item不是最后一个,则执行拖拽 needScaleBig = true; needScaleSmall = true; int size = mAdapter.getData().size(); if (size != maxSelectNum) { mItemTouchHelper.startDrag(holder); return; } if (holder.getLayoutPosition() != size - 1) { mItemTouchHelper.startDrag(holder); } }); mDragListener = new DragListener() { @Override public void deleteState(boolean isDelete) { if (isDelete) { tvDeleteText.setText(getString(R.string.app_let_go_drag_delete)); tvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.drawable.ic_let_go_delete, 0, 0); } else { tvDeleteText.setText(getString(R.string.app_drag_delete)); tvDeleteText.setCompoundDrawablesRelativeWithIntrinsicBounds(0, R.drawable.picture_icon_delete, 0, 0); } } @Override public void dragState(boolean isStart) { int visibility = tvDeleteText.getVisibility(); if (isStart) { if (visibility == View.GONE) { tvDeleteText.animate().alpha(1).setDuration(300).setInterpolator(new AccelerateInterpolator()); tvDeleteText.setVisibility(View.VISIBLE); } } else { if (visibility == View.VISIBLE) { tvDeleteText.animate().alpha(0).setDuration(300).setInterpolator(new AccelerateInterpolator()); tvDeleteText.setVisibility(View.GONE); } } } }; mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public boolean isLongPressDragEnabled() { return true; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { } @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { int itemViewType = viewHolder.getItemViewType(); if (itemViewType != GridImageAdapter.TYPE_CAMERA) { viewHolder.itemView.setAlpha(0.7f); } return makeMovementFlags(ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT, 0); } @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { //得到item原来的position try { int fromPosition = viewHolder.getAdapterPosition(); //得到目标position int toPosition = target.getAdapterPosition(); int itemViewType = target.getItemViewType(); if (itemViewType != GridImageAdapter.TYPE_CAMERA) { if (fromPosition < toPosition) { for (int i = fromPosition; i < toPosition; i++) { Collections.swap(mAdapter.getData(), i, i + 1); } } else { for (int i = fromPosition; i > toPosition; i--) { Collections.swap(mAdapter.getData(), i, i - 1); } } mAdapter.notifyItemMoved(fromPosition, toPosition); } } catch (Exception e) { e.printStackTrace(); } return true; } @Override public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { int itemViewType = viewHolder.getItemViewType(); if (itemViewType != GridImageAdapter.TYPE_CAMERA) { if (null == mDragListener) { return; } if (needScaleBig) { //如果需要执行放大动画 viewHolder.itemView.animate().scaleXBy(0.1f).scaleYBy(0.1f).setDuration(100); //执行完成放大动画,标记改掉 needScaleBig = false; //默认不需要执行缩小动画,当执行完成放大 并且松手后才允许执行 needScaleSmall = false; } int sh = recyclerView.getHeight() + tvDeleteText.getHeight(); int ry = tvDeleteText.getBottom() - sh; if (dY >= ry) { //拖到删除处 mDragListener.deleteState(true); if (isUpward) { //在删除处放手,则删除item viewHolder.itemView.setVisibility(View.INVISIBLE); mAdapter.delete(viewHolder.getAdapterPosition()); resetState(); return; } } else {//没有到删除处 if (View.INVISIBLE == viewHolder.itemView.getVisibility()) { //如果viewHolder不可见,则表示用户放手,重置删除区域状态 mDragListener.dragState(false); } if (needScaleSmall) {//需要松手后才能执行 viewHolder.itemView.animate().scaleXBy(1f).scaleYBy(1f).setDuration(100); } mDragListener.deleteState(false); } super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } } @Override public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { int itemViewType = viewHolder != null ? viewHolder.getItemViewType() : GridImageAdapter.TYPE_CAMERA; if (itemViewType != GridImageAdapter.TYPE_CAMERA) { if (ItemTouchHelper.ACTION_STATE_DRAG == actionState && mDragListener != null) { mDragListener.dragState(true); } super.onSelectedChanged(viewHolder, actionState); } } @Override public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animationType, float animateDx, float animateDy) { needScaleSmall = true; isUpward = true; return super.getAnimationDuration(recyclerView, animationType, animateDx, animateDy); } @Override public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { int itemViewType = viewHolder.getItemViewType(); if (itemViewType != GridImageAdapter.TYPE_CAMERA) { viewHolder.itemView.setAlpha(1.0f); super.clearView(recyclerView, viewHolder); mAdapter.notifyDataSetChanged(); resetState(); } } }); // 绑定拖拽事件 mItemTouchHelper.attachToRecyclerView(mRecyclerView); // 注册广播 BroadcastManager.getInstance(getContext()).registerReceiver(broadcastReceiver, BroadcastAction.ACTION_DELETE_PREVIEW_POSITION); } /** * 重置 */ private void resetState() { if (mDragListener != null) { mDragListener.deleteState(false); mDragListener.dragState(false); } isUpward = false; } /** * 清空缓存包括裁剪、压缩、AndroidQToPath所生成的文件,注意调用时机必须是处理完本身的业务逻辑后调用;非强制性 */ private void clearCache() { // 清空图片缓存,包括裁剪、压缩后的图片 注意:必须要在上传完成后调用 必须要获取权限 if (PermissionChecker.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)) { //PictureFileUtils.deleteCacheDirFile(this, PictureMimeType.ofImage()); PictureFileUtils.deleteAllCacheDirFile(getContext()); } else { PermissionChecker.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PictureConfig.APPLY_STORAGE_PERMISSIONS_CODE); } } private GridImageAdapter.onAddPicClickListener onAddPicClickListener = new GridImageAdapter.onAddPicClickListener() { @Override public void onAddPicClick() { boolean mode = cb_mode.isChecked(); if (mode) { // 进入相册 以下是例子:不需要的api可以不写 PictureSelector.create(MainActivity.this) .openGallery(chooseMode)// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio() .imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项 .theme(themeId)// 主题样式设置 具体参考 values/styles 用法:R.style.picture.white.style v2.3.3后 建议使用setPictureStyle()动态方式 .isWeChatStyle(isWeChatStyle)// 是否开启微信图片选择风格 .isUseCustomCamera(cb_custom_camera.isChecked())// 是否使用自定义相机 .setLanguage(language)// 设置语言,默认中文 .isPageStrategy(cbPage.isChecked())// 是否开启分页策略 & 每页多少条;默认开启 .setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题 .setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题 .setPictureWindowAnimationStyle(mWindowAnimationStyle)// 自定义相册启动退出动画 .setRecyclerAnimationMode(animationMode)// 列表动画效果 .isWithVideoImage(true)// 图片和视频是否可以同选,只在ofAll模式下有效 .isMaxSelectEnabledMask(cbEnabledMask.isChecked())// 选择数到了最大阀值列表是否启用蒙层效果 //.isAutomaticTitleRecyclerTop(false)// 连续点击标题栏RecyclerView是否自动回到顶部,默认true //.loadCacheResourcesCallback(GlideCacheEngine.createCacheEngine())// 获取图片资源缓存,主要是解决华为10部分机型在拷贝文件过多时会出现卡的问题,这里可以判断只在会出现一直转圈问题机型上使用 //.setOutputCameraPath()// 自定义相机输出目录,只针对Android Q以下,例如 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "Camera" + File.separator; //.setButtonFeatures(CustomCameraView.BUTTON_STATE_BOTH)// 设置自定义相机按钮状态 .maxSelectNum(maxSelectNum)// 最大图片选择数量 .minSelectNum(1)// 最小选择数量 .maxVideoSelectNum(1) // 视频最大选择数量 //.minVideoSelectNum(1)// 视频最小选择数量 //.closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 关闭在AndroidQ下获取图片或视频宽高相反自动转换 .imageSpanCount(4)// 每行显示个数 .isReturnEmpty(false)// 未选择数据时点击按钮是否可以返回 .closeAndroidQChangeWH(true)//如果图片有旋转角度则对换宽高,默认为true .closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 如果视频有旋转角度则对换宽高,默认为false //.isAndroidQTransform(false)// 是否需要处理Android Q 拷贝至应用沙盒的操作,只针对compress(false); && .isEnableCrop(false);有效,默认处理 .setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)// 设置相册Activity方向,不设置默认使用系统 .isOriginalImageControl(cb_original.isChecked())// 是否显示原图控制按钮,如果设置为true则用户可以自由选择是否使用原图,压缩、裁剪功能将会失效 //.bindCustomPlayVideoCallback(new MyVideoSelectedPlayCallback(getContext()))// 自定义视频播放回调控制,用户可以使用自己的视频播放界面 //.bindCustomPreviewCallback(new MyCustomPreviewInterfaceListener())// 自定义图片预览回调接口 //.bindCustomCameraInterfaceListener(new MyCustomCameraInterfaceListener())// 提供给用户的一些额外的自定义操作回调 //.cameraFileName(System.currentTimeMillis() +".jpg") // 重命名拍照文件名、如果是相册拍照则内部会自动拼上当前时间戳防止重复,注意这个只在使用相机时可以使用,如果使用相机又开启了压缩或裁剪 需要配合压缩和裁剪文件名api //.renameCompressFile(System.currentTimeMillis() +".jpg")// 重命名压缩文件名、 如果是多张压缩则内部会自动拼上当前时间戳防止重复 //.renameCropFileName(System.currentTimeMillis() + ".jpg")// 重命名裁剪文件名、 如果是多张裁剪则内部会自动拼上当前时间戳防止重复 .selectionMode(cb_choose_mode.isChecked() ? PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选 .isSingleDirectReturn(cb_single_back.isChecked())// 单选模式下是否直接返回,PictureConfig.SINGLE模式下有效 .isPreviewImage(cb_preview_img.isChecked())// 是否可预览图片 .isPreviewVideo(cb_preview_video.isChecked())// 是否可预览视频 //.querySpecifiedFormatSuffix(PictureMimeType.ofJPEG())// 查询指定后缀格式资源 .isEnablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频 .isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮 //.isMultipleSkipCrop(false)// 多图裁剪时是否支持跳过,默认支持 //.isMultipleRecyclerAnimation(false)// 多图裁剪底部列表显示动画效果 .isZoomAnim(true)// 图片列表点击 缩放效果 默认true //.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg,Android Q使用PictureMimeType.PNG_Q .isEnableCrop(cb_crop.isChecked())// 是否裁剪 //.basicUCropConfig()//对外提供所有UCropOptions参数配制,但如果PictureSelector原本支持设置的还是会使用原有的设置 .isCompress(cb_compress.isChecked())// 是否压缩 //.compressQuality(80)// 图片压缩后输出质量 0~ 100 .synOrAsy(true)//同步true或异步false 压缩 默认同步 //.queryMaxFileSize(10)// 只查多少M以内的图片、视频、音频 单位M //.compressSavePath(getPath())//压缩图片保存地址 //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效 注:已废弃 //.glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 注:已废弃 .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义 .hideBottomControls(!cb_hide.isChecked())// 是否显示uCrop工具栏,默认不显示 .isGif(cb_isGif.isChecked())// 是否显示gif图片 .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽 .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪 //.setCropDimmedColor(ContextCompat.getColor(getContext(), R.color.app_color_white))// 设置裁剪背景色值 //.setCircleDimmedBorderColor(ContextCompat.getColor(getApplicationContext(), R.color.app_color_white))// 设置圆形裁剪边框色值 //.setCircleStrokeWidth(3)// 设置圆形裁剪边框粗细 .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false .isOpenClickSound(cb_voice.isChecked())// 是否开启点击声音 .selectionData(mAdapter.getData())// 是否传入已选图片 //.isDragFrame(false)// 是否可拖动裁剪框(固定) //.videoMinSecond(10)// 查询多少秒以内的视频 //.videoMaxSecond(15)// 查询多少秒以内的视频 //.recordVideoSecond(10)//录制视频秒数 默认60s //.isPreviewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) //.cropCompressQuality(90)// 注:已废弃 改用cutOutQuality() .cutOutQuality(90)// 裁剪输出质量 默认100 .minimumCompressSize(100)// 小于多少kb的图片不压缩 //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.cropImageWideHigh()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.rotateEnabled(false) // 裁剪是否可旋转图片 //.scaleEnabled(false)// 裁剪是否可放大缩小图片 //.videoQuality()// 视频录制质量 0 or 1 //.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code .forResult(new MyResultCallback(mAdapter)); } else { // 单独拍照 PictureSelector.create(MainActivity.this) .openCamera(chooseMode)// 单独拍照,也可录像或也可音频 看你传入的类型是图片or视频 .theme(themeId)// 主题样式设置 具体参考 values/styles .imageEngine(GlideEngine.createGlideEngine())// 外部传入图片加载引擎,必传项 .setPictureStyle(mPictureParameterStyle)// 动态自定义相册主题 .setPictureCropStyle(mCropParameterStyle)// 动态自定义裁剪主题 .setPictureWindowAnimationStyle(mWindowAnimationStyle)// 自定义相册启动退出动画 .maxSelectNum(maxSelectNum)// 最大图片选择数量 .isUseCustomCamera(cb_custom_camera.isChecked())// 是否使用自定义相机 //.setOutputCameraPath()// 自定义相机输出目录,只针对Android Q以下,例如 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + File.separator + "Camera" + File.separator; .minSelectNum(1)// 最小选择数量 //.querySpecifiedFormatSuffix(PictureMimeType.ofPNG())// 查询指定后缀格式资源 .closeAndroidQChangeWH(true)//如果图片有旋转角度则对换宽高,默认为true .closeAndroidQChangeVideoWH(!SdkVersionUtils.checkedAndroid_Q())// 如果视频有旋转角度则对换宽高,默认false .selectionMode(cb_choose_mode.isChecked() ? PictureConfig.MULTIPLE : PictureConfig.SINGLE)// 多选 or 单选 //.cameraFileName(System.currentTimeMillis() + ".jpg")// 使用相机时保存至本地的文件名称,注意这个只在拍照时可以使用 //.renameCompressFile(System.currentTimeMillis() + ".jpg")// 重命名压缩文件名、 注意这个不要重复,只适用于单张图压缩使用 //.renameCropFileName(System.currentTimeMillis() + ".jpg")// 重命名裁剪文件名、 注意这个不要重复,只适用于单张图裁剪使用 .loadCacheResourcesCallback(GlideCacheEngine.createCacheEngine())// 获取图片资源缓存,主要是解决华为10部分机型在拷贝文件过多时会出现卡的问题,这里可以判断只在会出现一直转圈问题机型上使用 .isPreviewImage(cb_preview_img.isChecked())// 是否可预览图片 .isPreviewVideo(cb_preview_video.isChecked())// 是否可预览视频 .isEnablePreviewAudio(cb_preview_audio.isChecked()) // 是否可播放音频 .isCamera(cb_isCamera.isChecked())// 是否显示拍照按钮 .isEnableCrop(cb_crop.isChecked())// 是否裁剪 //.basicUCropConfig()//对外提供所有UCropOptions参数配制,但如果PictureSelector原本支持设置的还是会使用原有的设置 .isCompress(cb_compress.isChecked())// 是否压缩 .compressQuality(60)// 图片压缩后输出质量 .glideOverride(160, 160)// glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 .withAspectRatio(aspect_ratio_x, aspect_ratio_y)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义 .hideBottomControls(!cb_hide.isChecked())// 是否显示uCrop工具栏,默认不显示 .isGif(cb_isGif.isChecked())// 是否显示gif图片 .freeStyleCropEnabled(cb_styleCrop.isChecked())// 裁剪框是否可拖拽 .circleDimmedLayer(cb_crop_circular.isChecked())// 是否圆形裁剪 //.setCircleDimmedColor(ContextCompat.getColor(this, R.color.app_color_white))// 设置圆形裁剪背景色值 //.setCircleDimmedBorderColor(ContextCompat.getColor(this, R.color.app_color_white))// 设置圆形裁剪边框色值 //.setCircleStrokeWidth(3)// 设置圆形裁剪边框粗细 .showCropFrame(cb_showCropFrame.isChecked())// 是否显示裁剪矩形边框 圆形裁剪时建议设为false .showCropGrid(cb_showCropGrid.isChecked())// 是否显示裁剪矩形网格 圆形裁剪时建议设为false .isOpenClickSound(cb_voice.isChecked())// 是否开启点击声音 .selectionData(mAdapter.getData())// 是否传入已选图片 //.isPreviewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) //.cropCompressQuality(90)// 废弃 改用cutOutQuality() .cutOutQuality(90)// 裁剪输出质量 默认100 .minimumCompressSize(100)// 小于100kb的图片不压缩 //.cropWH()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.cropImageWideHigh()// 裁剪宽高比,设置如果大于图片本身宽高则无效 //.rotateEnabled() // 裁剪是否可旋转图片 //.scaleEnabled()// 裁剪是否可放大缩小图片 //.videoQuality()// 视频录制质量 0 or 1 //.forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code .forResult(new MyResultCallback(mAdapter)); } } }; /** * 返回结果回调 */ private static class MyResultCallback implements OnResultCallbackListener<LocalMedia> { private WeakReference<GridImageAdapter> mAdapterWeakReference; public MyResultCallback(GridImageAdapter adapter) { super(); this.mAdapterWeakReference = new WeakReference<>(adapter); } @Override public void onResult(List<LocalMedia> result) { for (LocalMedia media : result) { Log.i(TAG, "是否压缩:" + media.isCompressed()); Log.i(TAG, "压缩:" + media.getCompressPath()); Log.i(TAG, "原图:" + media.getPath()); Log.i(TAG, "是否裁剪:" + media.isCut()); Log.i(TAG, "裁剪:" + media.getCutPath()); Log.i(TAG, "是否开启原图:" + media.isOriginal()); Log.i(TAG, "原图路径:" + media.getOriginalPath()); Log.i(TAG, "Android Q 特有Path:" + media.getAndroidQToPath()); Log.i(TAG, "宽高: " + media.getWidth() + "x" + media.getHeight()); Log.i(TAG, "Size: " + media.getSize()); // TODO 可以通过PictureSelectorExternalUtils.getExifInterface();方法获取一些额外的资源信息,如旋转角度、经纬度等信息 } if (mAdapterWeakReference.get() != null) { mAdapterWeakReference.get().setList(result); mAdapterWeakReference.get().notifyDataSetChanged(); } } @Override public void onCancel() { Log.i(TAG, "PictureSelector Cancel"); } } /** * 自定义播放逻辑处理,用户可以自己实现播放界面 */ private static class MyVideoSelectedPlayCallback implements OnVideoSelectedPlayCallback<LocalMedia> { private WeakReference<Context> mContextWeakReference; private Context context; public MyVideoSelectedPlayCallback(Context context) { super(); this.mContextWeakReference = new WeakReference<>(context); this.context = mContextWeakReference.get(); } @Override public void startPlayVideo(LocalMedia media) { if (context != null) { ToastUtils.s(context, media.getPath()); } } } /** * 自定义预览图片接口 */ private static class MyCustomPreviewInterfaceListener implements OnCustomImagePreviewCallback<LocalMedia> { @Override public void onCustomPreviewCallback(Context context, List<LocalMedia> previewData, int currentPosition) { // TODO context特指PictureSelectorActivity if (previewData != null && previewData.size() > 0) { LocalMedia currentLocalMedia = previewData.get(currentPosition); if (currentLocalMedia != null) { } } } } /** * PictureSelector自定义的一些回调接口 */ private static class MyCustomCameraInterfaceListener implements OnCustomCameraInterfaceListener { @Override public void onCameraClick(Context context, PictureSelectionConfig config, int type) { // TODO 必须使用context.startActivityForResult(activity.class,PictureConfig.REQUEST_CAMERA); // TODO 为防止拍照内存不足导致Activity被回收的情况,最好把config类通过bundle.putParcelable(PictureConfig.EXTRA_CONFIG,config);传入到用户自定义相机页面,拍照成功后在.setResult()带回来 // TODO 注意:使用自定义相机时,需要设置PictureSelectionConfig ${config.cameraPath#config.cameraMimeType} // 1、config.cameraPath (文件输出路径) // 2、config.cameraMimeType (PictureMimeType.ofImage() or ofVideo) switch (type) { case PictureConfig.TYPE_IMAGE: // 拍照 // if (context instanceof Activity) { // Intent intent = new Intent(context, PictureCustomCameraActivity.class); // ((Activity) context).startActivityForResult(intent, PictureConfig.REQUEST_CAMERA); // PictureWindowAnimationStyle windowAnimationStyle = config.windowAnimationStyle; // ((Activity) context).overridePendingTransition(windowAnimationStyle != null && // windowAnimationStyle.activityEnterAnimation != 0 ? // windowAnimationStyle.activityEnterAnimation : R.anim.picture_anim_enter, R.anim.picture_anim_fade_in); // } ToastUtils.s(context, "Click Camera Image"); break; case PictureConfig.TYPE_VIDEO: // 录视频 ToastUtils.s(context, "Click Camera Video"); break; case PictureConfig.TYPE_AUDIO: // 录音 ToastUtils.s(context, "Click Camera Recording"); break; default: break; } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case PictureConfig.CHOOSE_REQUEST: // 图片选择结果回调 List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data); // 例如 LocalMedia 里面返回五种path // 1.media.getPath(); 原图path // 2.media.getCutPath();裁剪后path,需判断media.isCut();切勿直接使用 // 3.media.getCompressPath();压缩后path,需判断media.isCompressed();切勿直接使用 // 4.media.getOriginalPath()); media.isOriginal());为true时此字段才有值 // 5.media.getAndroidQToPath();Android Q版本特有返回的字段,但如果开启了压缩或裁剪还是取裁剪或压缩路径;注意:.isAndroidQTransform 为false 此字段将返回空 // 如果同时开启裁剪和压缩,则取压缩路径为准因为是先裁剪后压缩 for (LocalMedia media : selectList) { Log.i(TAG, "是否压缩:" + media.isCompressed()); Log.i(TAG, "压缩:" + media.getCompressPath()); Log.i(TAG, "原图:" + media.getPath()); Log.i(TAG, "是否裁剪:" + media.isCut()); Log.i(TAG, "裁剪:" + media.getCutPath()); Log.i(TAG, "是否开启原图:" + media.isOriginal()); Log.i(TAG, "原图路径:" + media.getOriginalPath()); Log.i(TAG, "Android Q 特有Path:" + media.getAndroidQToPath()); Log.i(TAG, "宽高: " + media.getWidth() + "x" + media.getHeight()); Log.i(TAG, "Size: " + media.getSize()); // TODO 可以通过PictureSelectorExternalUtils.getExifInterface();方法获取一些额外的资源信息,如旋转角度、经纬度等信息 } mAdapter.setList(selectList); mAdapter.notifyDataSetChanged(); break; } } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.left_back: finish(); break; case R.id.minus: if (maxSelectNum > 1) { maxSelectNum--; } tv_select_num.setText(maxSelectNum + ""); mAdapter.setSelectMax(maxSelectNum); break; case R.id.plus: maxSelectNum++; tv_select_num.setText(maxSelectNum + ""); mAdapter.setSelectMax(maxSelectNum); break; } } @Override public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) { switch (checkedId) { case R.id.rb_all: chooseMode = PictureMimeType.ofAll(); cb_preview_img.setChecked(true); cb_preview_video.setChecked(true); cb_isGif.setChecked(false); cb_preview_video.setChecked(true); cb_preview_img.setChecked(true); cb_preview_video.setVisibility(View.VISIBLE); cb_preview_img.setVisibility(View.VISIBLE); cb_compress.setVisibility(View.VISIBLE); cb_crop.setVisibility(View.VISIBLE); cb_isGif.setVisibility(View.VISIBLE); cb_preview_audio.setVisibility(View.GONE); break; case R.id.rb_image: chooseMode = PictureMimeType.ofImage(); cb_preview_img.setChecked(true); cb_preview_video.setChecked(false); cb_isGif.setChecked(false); cb_preview_video.setChecked(false); cb_preview_video.setVisibility(View.GONE); cb_preview_img.setChecked(true); cb_preview_audio.setVisibility(View.GONE); cb_preview_img.setVisibility(View.VISIBLE); cb_compress.setVisibility(View.VISIBLE); cb_crop.setVisibility(View.VISIBLE); cb_isGif.setVisibility(View.VISIBLE); break; case R.id.rb_video: chooseMode = PictureMimeType.ofVideo(); cb_preview_img.setChecked(false); cb_preview_video.setChecked(true); cb_isGif.setChecked(false); cb_isGif.setVisibility(View.GONE); cb_preview_video.setChecked(true); cb_preview_video.setVisibility(View.VISIBLE); cb_preview_img.setVisibility(View.GONE); cb_preview_img.setChecked(false); cb_compress.setVisibility(View.GONE); cb_preview_audio.setVisibility(View.GONE); cb_crop.setVisibility(View.GONE); break; case R.id.rb_audio: chooseMode = PictureMimeType.ofAudio(); cb_preview_audio.setVisibility(View.VISIBLE); break; case R.id.rb_jpan: language = LanguageConfig.JAPAN; break; case R.id.rb_tw: language = LanguageConfig.TRADITIONAL_CHINESE; break; case R.id.rb_us: language = LanguageConfig.ENGLISH; break; case R.id.rb_ka: language = LanguageConfig.KOREA; break; case R.id.rb_de: language = LanguageConfig.GERMANY; break; case R.id.rb_fr: language = LanguageConfig.FRANCE; break; case R.id.rb_crop_default: aspect_ratio_x = 0; aspect_ratio_y = 0; break; case R.id.rb_crop_1to1: aspect_ratio_x = 1; aspect_ratio_y = 1; break; case R.id.rb_crop_3to4: aspect_ratio_x = 3; aspect_ratio_y = 4; break; case R.id.rb_crop_3to2: aspect_ratio_x = 3; aspect_ratio_y = 2; break; case R.id.rb_crop_16to9: aspect_ratio_x = 16; aspect_ratio_y = 9; break; case R.id.rb_photo_default_animation: mWindowAnimationStyle = new PictureWindowAnimationStyle(); break; case R.id.rb_photo_up_animation: mWindowAnimationStyle = new PictureWindowAnimationStyle(); mWindowAnimationStyle.ofAllAnimation(R.anim.picture_anim_up_in, R.anim.picture_anim_down_out); break; case R.id.rb_default_style: themeId = R.style.picture_default_style; isWeChatStyle = false; getDefaultStyle(); break; case R.id.rb_white_style: themeId = R.style.picture_white_style; isWeChatStyle = false; getWhiteStyle(); break; case R.id.rb_num_style: themeId = R.style.picture_QQ_style; isWeChatStyle = false; getNumStyle(); break; case R.id.rb_sina_style: themeId = R.style.picture_Sina_style; isWeChatStyle = false; getSinaStyle(); break; case R.id.rb_we_chat_style: themeId = R.style.picture_WeChat_style; isWeChatStyle = true; getWeChatStyle(); break; case R.id.rb_default: animationMode = AnimationType.DEFAULT_ANIMATION; break; case R.id.rb_alpha: animationMode = AnimationType.ALPHA_IN_ANIMATION; break; case R.id.rb_slide_in: animationMode = AnimationType.SLIDE_IN_BOTTOM_ANIMATION; break; } } private void getDefaultStyle() { // 相册主题 mPictureParameterStyle = new PictureParameterStyle(); // 是否改变状态栏字体颜色(黑白切换) mPictureParameterStyle.isChangeStatusBarFontColor = false; // 是否开启右下角已完成(0/9)风格 mPictureParameterStyle.isOpenCompletedNumStyle = false; // 是否开启类似QQ相册带数字选择风格 mPictureParameterStyle.isOpenCheckNumStyle = false; // 相册状态栏背景色 mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#393a3e"); // 相册列表标题栏背景色 mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#393a3e"); // 相册父容器背景色 mPictureParameterStyle.pictureContainerBackgroundColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 相册列表标题栏右侧上拉箭头 mPictureParameterStyle.pictureTitleUpResId = R.drawable.picture_icon_arrow_up; // 相册列表标题栏右侧下拉箭头 mPictureParameterStyle.pictureTitleDownResId = R.drawable.picture_icon_arrow_down; // 相册文件夹列表选中圆点 mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval; // 相册返回箭头 mPictureParameterStyle.pictureLeftBackIcon = R.drawable.picture_icon_back; // 标题栏字体颜色 mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册右侧取消按钮字体颜色 废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 选择相册目录背景样式 mPictureParameterStyle.pictureAlbumStyle = R.drawable.picture_new_item_select_bg; // 相册列表勾选图片样式 mPictureParameterStyle.pictureCheckedStyle = R.drawable.picture_checkbox_selector; // 相册列表底部背景色 mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_grey); // 已选数量圆点背景样式 mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.picture_num_oval; // 相册列表底下预览文字色值(预览按钮可点击时的色值) mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值) mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册列表已完成色值(已完成 可点击色值) mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表未完成色值(请选择 不可点击色值) mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 预览界面底部背景色 mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_grey); // 外部预览界面删除按钮样式 mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_delete; // 原图按钮勾选样式 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalControlStyle = R.drawable.picture_original_wechat_checkbox; // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalFontColor = ContextCompat.getColor(getContext(), R.color.app_color_white); // 外部预览界面是否显示删除按钮 mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true; // 设置NavBar Color SDK Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP有效 mPictureParameterStyle.pictureNavBarColor = Color.parseColor("#393a3e"); // // 自定义相册右侧文本内容设置 // mPictureParameterStyle.pictureRightDefaultText = ""; // // 自定义相册未完成文本内容 // mPictureParameterStyle.pictureUnCompleteText = ""; // // 自定义相册完成文本内容 // mPictureParameterStyle.pictureCompleteText = ""; // // 自定义相册列表不可预览文字 // mPictureParameterStyle.pictureUnPreviewText = ""; // // 自定义相册列表预览文字 // mPictureParameterStyle.picturePreviewText = ""; // // // 自定义相册标题字体大小 // mPictureParameterStyle.pictureTitleTextSize = 18; // // 自定义相册右侧文字大小 // mPictureParameterStyle.pictureRightTextSize = 14; // // 自定义相册预览文字大小 // mPictureParameterStyle.picturePreviewTextSize = 14; // // 自定义相册完成文字大小 // mPictureParameterStyle.pictureCompleteTextSize = 14; // // 自定义原图文字大小 // mPictureParameterStyle.pictureOriginalTextSize = 14; // 裁剪主题 mCropParameterStyle = new PictureCropParameterStyle( ContextCompat.getColor(getContext(), R.color.app_color_grey), ContextCompat.getColor(getContext(), R.color.app_color_grey), Color.parseColor("#393a3e"), ContextCompat.getColor(getContext(), R.color.app_color_white), mPictureParameterStyle.isChangeStatusBarFontColor); } private void getWhiteStyle() { // 相册主题 mPictureParameterStyle = new PictureParameterStyle(); // 是否改变状态栏字体颜色(黑白切换) mPictureParameterStyle.isChangeStatusBarFontColor = true; // 是否开启右下角已完成(0/9)风格 mPictureParameterStyle.isOpenCompletedNumStyle = false; // 是否开启类似QQ相册带数字选择风格 mPictureParameterStyle.isOpenCheckNumStyle = false; // 相册状态栏背景色 mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#FFFFFF"); // 相册列表标题栏背景色 mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#FFFFFF"); // 相册列表标题栏右侧上拉箭头 mPictureParameterStyle.pictureTitleUpResId = R.drawable.ic_orange_arrow_up; // 相册列表标题栏右侧下拉箭头 mPictureParameterStyle.pictureTitleDownResId = R.drawable.ic_orange_arrow_down; // 相册文件夹列表选中圆点 mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval; // 相册返回箭头 mPictureParameterStyle.pictureLeftBackIcon = R.drawable.ic_back_arrow; // 标题栏字体颜色 mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 相册右侧取消按钮字体颜色 废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 选择相册目录背景样式 mPictureParameterStyle.pictureAlbumStyle = R.drawable.picture_new_item_select_bg; // 相册列表勾选图片样式 mPictureParameterStyle.pictureCheckedStyle = R.drawable.picture_checkbox_selector; // 相册列表底部背景色 mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa); // 已选数量圆点背景样式 mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.picture_num_oval; // 相册列表底下预览文字色值(预览按钮可点击时的色值) mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值) mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_9b); // 相册列表已完成色值(已完成 可点击色值) mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表未完成色值(请选择 不可点击色值) mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_9b); // 预览界面底部背景色 mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 原图按钮勾选样式 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalControlStyle = R.drawable.picture_original_checkbox; // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalFontColor = ContextCompat.getColor(getContext(), R.color.app_color_53575e); // 外部预览界面删除按钮样式 mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_black_delete; // 外部预览界面是否显示删除按钮 mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true; // // 自定义相册右侧文本内容设置 // mPictureParameterStyle.pictureRightDefaultText = ""; // // 自定义相册未完成文本内容 // mPictureParameterStyle.pictureUnCompleteText = ""; // // 自定义相册完成文本内容 // mPictureParameterStyle.pictureCompleteText = ""; // // 自定义相册列表不可预览文字 // mPictureParameterStyle.pictureUnPreviewText = ""; // // 自定义相册列表预览文字 // mPictureParameterStyle.picturePreviewText = ""; // // 自定义相册标题字体大小 // mPictureParameterStyle.pictureTitleTextSize = 18; // // 自定义相册右侧文字大小 // mPictureParameterStyle.pictureRightTextSize = 14; // // 自定义相册预览文字大小 // mPictureParameterStyle.picturePreviewTextSize = 14; // // 自定义相册完成文字大小 // mPictureParameterStyle.pictureCompleteTextSize = 14; // // 自定义原图文字大小 // mPictureParameterStyle.pictureOriginalTextSize = 14; // 裁剪主题 mCropParameterStyle = new PictureCropParameterStyle( ContextCompat.getColor(getContext(), R.color.app_color_white), ContextCompat.getColor(getContext(), R.color.app_color_white), ContextCompat.getColor(getContext(), R.color.app_color_black), mPictureParameterStyle.isChangeStatusBarFontColor); } private void getNumStyle() { // 相册主题 mPictureParameterStyle = new PictureParameterStyle(); // 是否改变状态栏字体颜色(黑白切换) mPictureParameterStyle.isChangeStatusBarFontColor = false; // 是否开启右下角已完成(0/9)风格 mPictureParameterStyle.isOpenCompletedNumStyle = false; // 是否开启类似QQ相册带数字选择风格 mPictureParameterStyle.isOpenCheckNumStyle = true; // 相册状态栏背景色 mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#7D7DFF"); // 相册列表标题栏背景色 mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#7D7DFF"); // 相册列表标题栏右侧上拉箭头 mPictureParameterStyle.pictureTitleUpResId = R.drawable.picture_icon_arrow_up; // 相册列表标题栏右侧下拉箭头 mPictureParameterStyle.pictureTitleDownResId = R.drawable.picture_icon_arrow_down; // 相册文件夹列表选中圆点 mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval; // 相册返回箭头 mPictureParameterStyle.pictureLeftBackIcon = R.drawable.picture_icon_back; // 标题栏字体颜色 mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(getContext(), R.color.app_color_white); // 相册右侧取消按钮字体颜色 废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(getContext(), R.color.app_color_white); // 选择相册目录背景样式 mPictureParameterStyle.pictureAlbumStyle = R.drawable.picture_new_item_select_bg; // 相册列表勾选图片样式 mPictureParameterStyle.pictureCheckedStyle = R.drawable.checkbox_num_selector; // 相册列表底部背景色 mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa); // 已选数量圆点背景样式 mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.num_oval_blue; // 相册列表底下预览文字色值(预览按钮可点击时的色值) mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_blue); // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值) mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(getContext(), R.color.app_color_blue); // 相册列表已完成色值(已完成 可点击色值) mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(getContext(), R.color.app_color_blue); // 相册列表未完成色值(请选择 不可点击色值) mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(getContext(), R.color.app_color_blue); // 预览界面底部背景色 mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa); // 原图按钮勾选样式 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalControlStyle = R.drawable.picture_original_blue_checkbox; // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalFontColor = ContextCompat.getColor(getContext(), R.color.app_color_blue); // 外部预览界面删除按钮样式 mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_delete; // 外部预览界面是否显示删除按钮 mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true; // // 自定义相册右侧文本内容设置 // mPictureParameterStyle.pictureRightDefaultText = ""; // // 自定义相册未完成文本内容 // mPictureParameterStyle.pictureUnCompleteText = ""; // // 自定义相册完成文本内容 // mPictureParameterStyle.pictureCompleteText = ""; // // 自定义相册列表不可预览文字 // mPictureParameterStyle.pictureUnPreviewText = ""; // // 自定义相册列表预览文字 // mPictureParameterStyle.picturePreviewText = ""; // // 自定义相册标题字体大小 // mPictureParameterStyle.pictureTitleTextSize = 18; // // 自定义相册右侧文字大小 // mPictureParameterStyle.pictureRightTextSize = 14; // // 自定义相册预览文字大小 // mPictureParameterStyle.picturePreviewTextSize = 14; // // 自定义相册完成文字大小 // mPictureParameterStyle.pictureCompleteTextSize = 14; // // 自定义原图文字大小 // mPictureParameterStyle.pictureOriginalTextSize = 14; // 裁剪主题 mCropParameterStyle = new PictureCropParameterStyle( ContextCompat.getColor(getContext(), R.color.app_color_blue), ContextCompat.getColor(getContext(), R.color.app_color_blue), ContextCompat.getColor(getContext(), R.color.app_color_white), mPictureParameterStyle.isChangeStatusBarFontColor); } private void getSinaStyle() { // 相册主题 mPictureParameterStyle = new PictureParameterStyle(); // 是否改变状态栏字体颜色(黑白切换) mPictureParameterStyle.isChangeStatusBarFontColor = true; // 是否开启右下角已完成(0/9)风格 mPictureParameterStyle.isOpenCompletedNumStyle = true; // 是否开启类似QQ相册带数字选择风格 mPictureParameterStyle.isOpenCheckNumStyle = false; // 相册状态栏背景色 mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#FFFFFF"); // 相册列表标题栏背景色 mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#FFFFFF"); // 相册列表标题栏右侧上拉箭头 mPictureParameterStyle.pictureTitleUpResId = R.drawable.ic_orange_arrow_up; // 相册列表标题栏右侧下拉箭头 mPictureParameterStyle.pictureTitleDownResId = R.drawable.ic_orange_arrow_down; // 相册文件夹列表选中圆点 mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval; // 相册返回箭头 mPictureParameterStyle.pictureLeftBackIcon = R.drawable.ic_back_arrow; // 标题栏字体颜色 mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 相册右侧取消按钮字体颜色 废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 选择相册目录背景样式 mPictureParameterStyle.pictureAlbumStyle = R.drawable.picture_new_item_select_bg; // 相册列表勾选图片样式 mPictureParameterStyle.pictureCheckedStyle = R.drawable.picture_checkbox_selector; // 相册列表底部背景色 mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa); // 已选数量圆点背景样式 mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.picture_num_oval; // 相册列表底下预览文字色值(预览按钮可点击时的色值) mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值) mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_9b); // 相册列表已完成色值(已完成 可点击色值) mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa632d); // 相册列表未完成色值(请选择 不可点击色值) mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_9b); // 预览界面底部背景色 mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_fa); // 原图按钮勾选样式 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalControlStyle = R.drawable.picture_original_checkbox; // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalFontColor = ContextCompat.getColor(getContext(), R.color.app_color_53575e); // 外部预览界面删除按钮样式 mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_black_delete; // 外部预览界面是否显示删除按钮 mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true; // // 自定义相册右侧文本内容设置 // mPictureParameterStyle.pictureRightDefaultText = ""; // 完成文案是否采用(%1$d/%2$d)的字符串,只允许俩个占位符哟 // mPictureParameterStyle.isCompleteReplaceNum = true; // // 自定义相册未完成文本内容 // mPictureParameterStyle.pictureUnCompleteText = "请选择"; // 自定义相册完成文本内容,已经支持两个占位符String 但isCompleteReplaceNum必须为true // mPictureParameterStyle.pictureCompleteText = getString(R.string.app_wechat_send_num); // // 自定义相册列表不可预览文字 // mPictureParameterStyle.pictureUnPreviewText = ""; // // 自定义相册列表预览文字 // mPictureParameterStyle.picturePreviewText = ""; // // 自定义相册标题字体大小 // mPictureParameterStyle.pictureTitleTextSize = 18; // // 自定义相册右侧文字大小 // mPictureParameterStyle.pictureRightTextSize = 14; // // 自定义相册预览文字大小 // mPictureParameterStyle.picturePreviewTextSize = 14; // // 自定义相册完成文字大小 // mPictureParameterStyle.pictureCompleteTextSize = 14; // // 自定义原图文字大小 // mPictureParameterStyle.pictureOriginalTextSize = 14; // 裁剪主题 mCropParameterStyle = new PictureCropParameterStyle( ContextCompat.getColor(getContext(), R.color.app_color_white), ContextCompat.getColor(getContext(), R.color.app_color_white), ContextCompat.getColor(getContext(), R.color.app_color_black), mPictureParameterStyle.isChangeStatusBarFontColor); } private void getWeChatStyle() { // 相册主题 mPictureParameterStyle = new PictureParameterStyle(); // 是否改变状态栏字体颜色(黑白切换) mPictureParameterStyle.isChangeStatusBarFontColor = false; // 是否开启右下角已完成(0/9)风格 mPictureParameterStyle.isOpenCompletedNumStyle = false; // 是否开启类似QQ相册带数字选择风格 mPictureParameterStyle.isOpenCheckNumStyle = true; // 状态栏背景色 mPictureParameterStyle.pictureStatusBarColor = Color.parseColor("#393a3e"); // 相册列表标题栏背景色 mPictureParameterStyle.pictureTitleBarBackgroundColor = Color.parseColor("#393a3e"); // 相册父容器背景色 mPictureParameterStyle.pictureContainerBackgroundColor = ContextCompat.getColor(getContext(), R.color.app_color_black); // 相册列表标题栏右侧上拉箭头 mPictureParameterStyle.pictureTitleUpResId = R.drawable.picture_icon_wechat_up; // 相册列表标题栏右侧下拉箭头 mPictureParameterStyle.pictureTitleDownResId = R.drawable.picture_icon_wechat_down; // 相册文件夹列表选中圆点 mPictureParameterStyle.pictureFolderCheckedDotStyle = R.drawable.picture_orange_oval; // 相册返回箭头 mPictureParameterStyle.pictureLeftBackIcon = R.drawable.picture_icon_close; // 标题栏字体颜色 mPictureParameterStyle.pictureTitleTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册右侧按钮字体颜色 废弃 改用.pictureRightDefaultTextColor和.pictureRightDefaultTextColor mPictureParameterStyle.pictureCancelTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_53575e); // 相册右侧按钮字体默认颜色 mPictureParameterStyle.pictureRightDefaultTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_53575e); // 相册右侧按可点击字体颜色,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureRightSelectedTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册右侧按钮背景样式,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureUnCompleteBackgroundStyle = R.drawable.picture_send_button_default_bg; // 相册右侧按钮可点击背景样式,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureCompleteBackgroundStyle = R.drawable.picture_send_button_bg; // 选择相册目录背景样式 mPictureParameterStyle.pictureAlbumStyle = R.drawable.picture_new_item_select_bg; // 相册列表勾选图片样式 mPictureParameterStyle.pictureCheckedStyle = R.drawable.picture_wechat_num_selector; // 相册标题背景样式 ,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureWeChatTitleBackgroundStyle = R.drawable.picture_album_bg; // 微信样式 预览右下角样式 ,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureWeChatChooseStyle = R.drawable.picture_wechat_select_cb; // 相册返回箭头 ,只针对isWeChatStyle 为true时有效果 mPictureParameterStyle.pictureWeChatLeftBackStyle = R.drawable.picture_icon_back; // 相册列表底部背景色 mPictureParameterStyle.pictureBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_grey); // 已选数量圆点背景样式 mPictureParameterStyle.pictureCheckNumBgStyle = R.drawable.picture_num_oval; // 相册列表底下预览文字色值(预览按钮可点击时的色值) mPictureParameterStyle.picturePreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册列表底下不可预览文字色值(预览按钮不可点击时的色值) mPictureParameterStyle.pictureUnPreviewTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_9b); // 相册列表已完成色值(已完成 可点击色值) mPictureParameterStyle.pictureCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_white); // 相册列表未完成色值(请选择 不可点击色值) mPictureParameterStyle.pictureUnCompleteTextColor = ContextCompat.getColor(getContext(), R.color.picture_color_53575e); // 预览界面底部背景色 mPictureParameterStyle.picturePreviewBottomBgColor = ContextCompat.getColor(getContext(), R.color.picture_color_half_grey); // 外部预览界面删除按钮样式 mPictureParameterStyle.pictureExternalPreviewDeleteStyle = R.drawable.picture_icon_delete; // 原图按钮勾选样式 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalControlStyle = R.drawable.picture_original_wechat_checkbox; // 原图文字颜色 需设置.isOriginalImageControl(true); 才有效 mPictureParameterStyle.pictureOriginalFontColor = ContextCompat.getColor(getContext(), R.color.app_color_white); // 外部预览界面是否显示删除按钮 mPictureParameterStyle.pictureExternalPreviewGonePreviewDelete = true; // 设置NavBar Color SDK Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP有效 mPictureParameterStyle.pictureNavBarColor = Color.parseColor("#393a3e"); // 完成文案是否采用(%1$d/%2$d)的字符串,只允许两个占位符哟 // mPictureParameterStyle.isCompleteReplaceNum = true; // 自定义相册右侧文本内容设置 // mPictureParameterStyle.pictureUnCompleteText = getString(R.string.app_wechat_send); //自定义相册右侧已选中时文案 支持占位符String 但只支持两个 必须isCompleteReplaceNum为true // mPictureParameterStyle.pictureCompleteText = getString(R.string.app_wechat_send_num); // // 自定义相册列表不可预览文字 // mPictureParameterStyle.pictureUnPreviewText = ""; // // 自定义相册列表预览文字 // mPictureParameterStyle.picturePreviewText = ""; // // 自定义预览页右下角选择文字文案 // mPictureParameterStyle.pictureWeChatPreviewSelectedText = ""; // // 自定义相册标题文字大小 // mPictureParameterStyle.pictureTitleTextSize = 9; // // 自定义相册右侧文字大小 // mPictureParameterStyle.pictureRightTextSize = 9; // // 自定义相册预览文字大小 // mPictureParameterStyle.picturePreviewTextSize = 9; // // 自定义相册完成文字大小 // mPictureParameterStyle.pictureCompleteTextSize = 9; // // 自定义原图文字大小 // mPictureParameterStyle.pictureOriginalTextSize = 9; // // 自定义预览页右下角选择文字大小 // mPictureParameterStyle.pictureWeChatPreviewSelectedTextSize = 9; // 裁剪主题 mCropParameterStyle = new PictureCropParameterStyle( ContextCompat.getColor(getContext(), R.color.app_color_grey), ContextCompat.getColor(getContext(), R.color.app_color_grey), Color.parseColor("#393a3e"), ContextCompat.getColor(getContext(), R.color.app_color_white), mPictureParameterStyle.isChangeStatusBarFontColor); } private int x = 0, y = 0; @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { switch (buttonView.getId()) { case R.id.cb_crop: rgb_crop.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_hide.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_crop_circular.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_styleCrop.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_showCropFrame.setVisibility(isChecked ? View.VISIBLE : View.GONE); cb_showCropGrid.setVisibility(isChecked ? View.VISIBLE : View.GONE); break; case R.id.cb_crop_circular: if (isChecked) { x = aspect_ratio_x; y = aspect_ratio_y; aspect_ratio_x = 1; aspect_ratio_y = 1; } else { aspect_ratio_x = x; aspect_ratio_y = y; } rgb_crop.setVisibility(isChecked ? View.GONE : View.VISIBLE); if (isChecked) { cb_showCropFrame.setChecked(false); cb_showCropGrid.setChecked(false); } else { cb_showCropFrame.setChecked(true); cb_showCropGrid.setChecked(true); } break; } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case PictureConfig.APPLY_STORAGE_PERMISSIONS_CODE: // 存储权限 for (int i = 0; i < grantResults.length; i++) { if (grantResults[i] == PackageManager.PERMISSION_GRANTED) { PictureFileUtils.deleteCacheDirFile(getContext(), PictureMimeType.ofImage()); } else { Toast.makeText(MainActivity.this, getString(R.string.picture_jurisdiction), Toast.LENGTH_SHORT).show(); } } break; } } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mAdapter != null && mAdapter.getData() != null && mAdapter.getData().size() > 0) { outState.putParcelableArrayList("selectorList", (ArrayList<? extends Parcelable>) mAdapter.getData()); } } private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (TextUtils.isEmpty(action)) { return; } if (BroadcastAction.ACTION_DELETE_PREVIEW_POSITION.equals(action)) { // 外部预览删除按钮回调 Bundle extras = intent.getExtras(); if (extras != null) { int position = extras.getInt(PictureConfig.EXTRA_PREVIEW_DELETE_POSITION); ToastUtils.s(getContext(), "delete image index:" + position); mAdapter.remove(position); mAdapter.notifyItemRemoved(position); } } } }; @Override protected void onDestroy() { super.onDestroy(); if (broadcastReceiver != null) { BroadcastManager.getInstance(getContext()).unregisterReceiver(broadcastReceiver, BroadcastAction.ACTION_DELETE_PREVIEW_POSITION); } } public Context getContext() { return this; } }