我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中如何使用ImageEditContainer图片选择器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中如何使用ImageEditContainer图片选择器

Android中如何使用ImageEditContainer图片选择器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1. 简介

ImageEditButton 和 ImageEditContainer。其中ImageEditContainer 是在 ImageEditButton,两个组件可单独使用。

在demo中,实现了 图片选择(拍照+本地),裁剪,压缩,保存本地 以及对已选择图片的删除操作(如果有修改需求,也可以使用对应方法进行操作,该方法已添加);

 还有就是 针对 6.0权限的处理问题,本次使用了第三方库 rxpermissions 进行权限的处理。

2.项目主目录结构

Android中如何使用ImageEditContainer图片选择器

3. 功能介绍

MainActivity.java 界面效果图:

Android中如何使用ImageEditContainer图片选择器Android中如何使用ImageEditContainer图片选择器

ImageEditContainer 组件初始化:

layImageContainer = (ImageEditContainer) findViewById(R.id.lay_image_container);layImageContainer.setEditListener(this);layImageContainer.setBtnImageResource(R.drawable.icon_picture_photograph);layImageContainer.setTotalImageQuantity(3);

如上代码,设置组件的监听,添加按钮展示图,以及最多选择图片个数。

implements  ImageEditContainer.ImageEditContainerListener 的实现

@Override public void doAddImage() { PopupWindow mCameraPop = SelectPicturePopupWindowUtils.showSelectPicturePopupWindow(this); if (mCameraPop != null)  mCameraPop.showAtLocation(layImageContainer, Gravity.BOTTOM, 0, 0); }  @Override public void doEditLocalImage(ImageItem imageItem) { if (imageItem != null) {  layImageContainer.updateEditedImageItem(imageItem); } }  @Override public void doEditRemoteImage(RemoteImageItem remoteImageItem) { if (remoteImageItem != null) {  if (remoteImageItem.isDeleted) {  layImageContainer.removeRemoteImageItem(remoteImageItem);  } else {  layImageContainer.updateRemoteImageItem(remoteImageItem);  } } }

当图片选择数量达到最大个数时,添加按钮会消失。效果图如下所示:

Android中如何使用ImageEditContainer图片选择器

图片裁剪 效果图如下所示:

图片可拖拽,缩放

Android中如何使用ImageEditContainer图片选择器

图片选择好后,进行图片压缩:

private void compressImage(String path) { if (TextUtils.isEmpty(path)) { return; } compressImage = compressImage + 1; ImageItem imageItem = new ImageItem(); imageItem.storedPath = path; File file = new File(FilePathUtils.getImageSavePath()); if (!file.exists()) { file.mkdirs(); } String filePath = FilePathUtils.getImageSavePath() + System.currentTimeMillis() + ".jpg"; new Thread(new MyThread(imageItem, path, filePath)).start(); List<String> imagePaths = new ArrayList<>(); imagePaths.add(path); layImageContainer.addNewImageItem(imageItem); }

图片压缩比较慢,要开启个 线程进行压缩:

public class MyThread implements Runnable { private String imgPath; private String outPath; private ImageItem imageItem; public MyThread(ImageItem imageItem, String imgPath, String outPath) { this.imageItem = imageItem; this.imgPath = imgPath; this.outPath = outPath; } public void run() { try { BitmapUtil.compressAndGenImage(imgPath, outPath, 500, false); compressImage = compressImage - 1; imageItem.storedPath = outPath; } catch (IOException e) { compressImage = compressImage - 1; e.printStackTrace(); } } }

使用的压缩方法:

  public static void compressAndGenImage(String imgPath, String outPath, int maxSize, boolean needsDelete) throws IOException { compressAndGenImage(getBitmap(imgPath), outPath, maxSize); // Delete original file if (needsDelete) { File file = new File(imgPath); if (file.exists()) { file.delete(); } } }

组件 ImageEditContainer 添加图片方法介绍:

可添加本地和网络图片

  public void addNewImages(List<String> storePaths) { }  public void addNewImageItem(ImageItem imageItem) { }  public void addRemoteImageItem(RemoteImageItem remoteImageItem) { }

组件 ImageEditContainer 其他方法介绍:

public void setImvHeightAndWidth(int height, int width) { }   public void setTotalImageQuantity(int totalImageQuantity) { } public void setBtnImageResource(int resid) { }   public List<Object> getAllImageItems() { }  public void updateEditedImageItem(ImageItem imageItem) {  }   public void updateRemoteImageItem(RemoteImageItem remoteImageItem) {}   public void removeRemoteImageItem(RemoteImageItem remoteImageItem) {}

4. 组件代码

ImageEditButton.java

public class ImageEditButton extends RelativeLayout { private final static String TAG = "ImageEditButton"; private ImageView imvAddImage; private ImageView imvEdit; private int imvHeight; private int imvWidth; public ImageEditButtonListener editButtonListener; public ImageEditButton(Context context) { this(context, null); } public ImageEditButton(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.image_edit_button_view, this, true); imvHeight = CommonUtil.dip2px(getContext(), 70); imvWidth = imvHeight; imvAddImage = (ImageView) findViewById(R.id.imv_add_image); imvEdit = (ImageView) findViewById(R.id.imv_edit); setImvHeightAndWidth(imvHeight, imvWidth); imvAddImage.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doEditImage(); } }); imvEdit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { doEditImage2(); } }); } public void setImvHeightAndWidth(int height, int width) { this.imvHeight = height; this.imvWidth = width; ViewGroup.LayoutParams layoutParams = imvAddImage.getLayoutParams(); layoutParams.width = imvHeight; layoutParams.height = imvWidth; imvAddImage.setLayoutParams(layoutParams); } public int getImvHeight() { return imvHeight; } public int getImvWidth() { return imvWidth; } public void setPadding2(int left, int top, int right, int bottom) { this.setPadding(left, top, right, bottom); } public void setBtnImageResource(int resid) { imvAddImage.setImageResource(resid);// ImageLoaderUtils.loadImageFromDrawable(resid, imvAddImage, null); } public void reset() { imvEdit.setVisibility(GONE); } public void setEditButtonListener(ImageEditButtonListener editButtonListener) { this.editButtonListener = editButtonListener; } public BaseImageItem getImageItem() { Object object = this.getTag(); if (object instanceof BaseImageItem) return (BaseImageItem) object; return null; } public void displayUI() { // Object object = this.getTag(); if (object == null) return; if (object instanceof ImageItem) { ImageItem imageItem = (ImageItem) object; if (TextUtils.isEmpty(imageItem.storedPath)) return; File file = new File(imageItem.storedPath); if (file.exists()) {// 其实Glide加载本地图片和加载网络图片调用的方法是一样的,唯一的区别是说加载SD卡的图片需要SD卡的权限,加载网络需要网络权限 Glide.with(getContext()).load(file).crossFade().into(imvAddImage); } } else if (object instanceof RemoteImageItem) { // 如果是 remoteImageItem 则需要从读取图片,同时不可以裁剪 RemoteImageItem remoteImageItem = (RemoteImageItem) object; Glide.with(getContext()).load(remoteImageItem.thumbUrl).centerCrop().crossFade().into(imvAddImage); } // TODO BaseImageItem baseImageItem = (BaseImageItem) object; displayNoteIcons(baseImageItem); } private void displayNoteIcons(BaseImageItem baseImageItem) { imvEdit.setVisibility(VISIBLE); } private void doEditImage() { if (editButtonListener == null) return; Object object = this.getTag(); if (object == null) { // add image editButtonListener.doAddImage(); } else { // if (object instanceof ImageItem) { editButtonListener.doEditLocalImage((ImageItem) object); } else if (object instanceof RemoteImageItem) { editButtonListener.doEditRemoteImage((RemoteImageItem) object); } } } private void doEditImage2() { if (editButtonListener == null) return; Object object = this.getTag(); if (object != null) { // if (object instanceof ImageItem) { ImageItem imageItem = (ImageItem) object; imageItem.isDeleted = true; editButtonListener.doEditLocalImage(imageItem); } else if (object instanceof RemoteImageItem) { RemoteImageItem remoteImageItem = (RemoteImageItem) object; remoteImageItem.isDeleted = true; editButtonListener.doEditRemoteImage(remoteImageItem); } } } public interface ImageEditButtonListener { public void doAddImage(); public void doEditLocalImage(ImageItem imageItem1); public void doEditRemoteImage(RemoteImageItem remoteImageItem); }}

ImageEditContainer.java

public class ImageEditContainer extends HorizontalScrollView implements ImageEditButton.ImageEditButtonListener { private final static String TAG = "ImageEditContainer"; public ImageEditContainerListener mEditListener; private int idValue = 0; ImageEditButton imbAddImage; ViewGroup buttonsContainer; private int totalImageQuantity = 3;// 总添加数量 private int mBtnBgResid = 0; public ImageEditContainer(Context context) { //super(context); this(context, null); } public ImageEditContainer(Context context, AttributeSet attrs) { super(context, attrs); // LayoutInflater.from(context).inflate(R.layout.image_edit_container, this, true); imbAddImage = (ImageEditButton) findViewById(R.id.imb_add_image); imbAddImage.setEditButtonListener(this); // buttonsContainer = (ViewGroup) findViewById(R.id.lay_container); setHorizontalScrollBarEnabled(false); setHorizontalFadingEdgeEnabled(false); } public void setImvHeightAndWidth(int height, int width) { for (int i = 0; i < buttonsContainer.getChildCount(); i++) { ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i); if (imageEditButton == null) continue; imageEditButton.setImvHeightAndWidth(height, width); } } public void setTotalImageQuantity(int totalImageQuantity) { if (totalImageQuantity > 0) this.totalImageQuantity = totalImageQuantity; } public void setBtnImageResource(int resid) { mBtnBgResid = resid; imbAddImage.setBtnImageResource(mBtnBgResid); } public List<Object> getAllImageItems() { List<Object> allItems = new ArrayList<>(); for (int i = 0; i < buttonsContainer.getChildCount(); i++) { ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i); if (imageEditButton == null) continue; if (imageEditButton.getTag() == null) continue; allItems.add(imageEditButton.getTag()); } return allItems; }  public void addNewImages(List<String> storePaths) { for (int i = 0; i < storePaths.size(); i++) { String path = storePaths.get(i); ImageItem imageItem = new ImageItem(); imageItem.storedPath = path; imageItem.id = idValue++; Log.i(TAG, "index=" + i + " id=" + imageItem.id); imageItem.index = (buttonsContainer.getChildCount() - 1); addBaseImageItemToContainer(imageItem); } }  public void addNewImageItem(ImageItem imageItem) { if (imageItem == null) return; imageItem.id = idValue++; imageItem.index = (buttonsContainer.getChildCount() - 1); addBaseImageItemToContainer(imageItem); } public void updateEditedImageItem(ImageItem imageItem) { ImageEditButton imageEditButton = getImageEditButtonForImageItemById(imageItem); if (imageEditButton == null) { return; } Object originObj = imageEditButton.getTag(); if (!(originObj instanceof ImageItem)) { if (originObj instanceof RemoteImageItem) { RemoteImageItem remoteItem = (RemoteImageItem) originObj; if (remoteItem.index == imageItem.index) {  imageEditButton.setTag(imageItem);  imageEditButton.displayUI();  return; } reorderForImageItem(imageItem); } return; } ImageItem originImageItem = (ImageItem) originObj; if (imageItem.isDeleted) { removeButtonContainImageItem(imageItem); resetImageItemIndex(); return; } else { if (originImageItem.index == imageItem.index) { imageEditButton.setTag(imageItem); imageEditButton.displayUI(); return; } reorderForImageItem(imageItem); } }  public void addRemoteImageItem(RemoteImageItem remoteImageItem) { addBaseImageItemToContainer(remoteImageItem); }  public void updateRemoteImageItem(RemoteImageItem remoteImageItem) { ImageEditButton imageEditButton = getImageEditButtonForImageItemById(remoteImageItem); if (imageEditButton == null) { if (getAllImageItems().size() > 0) { List<Object> objectList = getAllImageItems(); for (int i = 0; i < objectList.size(); i++) {  BaseImageItem baseImageItem = (BaseImageItem) objectList.get(i);  removeButtonContainImageItem(baseImageItem); } // objectList.add(0, remoteImageItem); for (int i = 0; i < objectList.size(); i++) {  addRemoteImageItem((RemoteImageItem) objectList.get(i)); } // } else { addRemoteImageItem(remoteImageItem); } return; } BaseImageItem baseImageItem = (BaseImageItem) imageEditButton.getTag(); if (baseImageItem instanceof ImageItem) return; RemoteImageItem originRemoteItem = (RemoteImageItem) baseImageItem; if (remoteImageItem.index == originRemoteItem.index) { // index 相同 只是update imageEditButton.setTag(remoteImageItem); imageEditButton.displayUI(); return; } reorderForImageItem(remoteImageItem); }  public void removeRemoteImageItem(RemoteImageItem remoteImageItem) { ImageEditButton imageEditButton = getImageEditButtonForImageItemById(remoteImageItem); if (null != imageEditButton && null != imageEditButton.getTag()) { BaseImageItem baseImageItem = (BaseImageItem) imageEditButton.getTag(); if (baseImageItem instanceof ImageItem) return; RemoteImageItem originRemoteItem = (RemoteImageItem) baseImageItem; removeButtonContainImageItem(remoteImageItem); resetImageItemIndex(); } } private void reorderForImageItem(BaseImageItem imageItem) { removeButtonContainImageItem(imageItem); List<BaseImageItem> imageItems = new ArrayList<>(); imageItems.add(imageItem); int count = buttonsContainer.getChildCount(); for (int i = imageItem.index; i < count; i++) { ImageEditButton button = (ImageEditButton) buttonsContainer.getChildAt(i); if (button == null) continue; BaseImageItem imageItem1 = (BaseImageItem) button.getTag(); if (imageItem1 == null) continue; imageItems.add(imageItem1); } for (int i = 0; i < imageItems.size(); i++) { BaseImageItem item = imageItems.get(i); removeButtonContainImageItem(item); } // for (int i = 0; i < imageItems.size(); i++) { addBaseImageItemToContainer(imageItems.get(i)); } } private void resetImageItemIndex() { for (int i = 0; i < buttonsContainer.getChildCount(); i++) { try { ImageEditButton button = (ImageEditButton) buttonsContainer.getChildAt(i); if (button == null) continue; BaseImageItem imageItem = (BaseImageItem) button.getTag(); if (imageItem == null) continue; imageItem.index = i; } catch (Exception ignored) { } } } private ImageEditButton getImageEditButtonForImageItemById(BaseImageItem imageItem) { for (int i = 0; i < buttonsContainer.getChildCount(); i++) { ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i); if (imageEditButton == null) continue; if (imageEditButton.getImageItem() == null) continue; BaseImageItem searchedImageItem = imageEditButton.getImageItem(); if (imageItem.id.longValue() == searchedImageItem.id.longValue()) { return imageEditButton; } } return null; }  private void removeButtonContainImageItem(BaseImageItem imageItem) { ImageEditButton imageEditButton = getImageEditButtonForImageItemById(imageItem); if (imageEditButton == null) return; buttonsContainer.removeView(imageEditButton); resetImageItemIndex(); imbAddImage.setVisibility(buttonsContainer.getChildCount() <= totalImageQuantity ? VISIBLE : GONE); } private void addBaseImageItemToContainer(BaseImageItem imageItem) { buttonsContainer.removeView(imbAddImage); ImageEditButton imageEditButton = new ImageEditButton(getContext()); if (mBtnBgResid != 0) imageEditButton.setBtnImageResource(mBtnBgResid); imageEditButton.setTag(imageItem); imageEditButton.setEditButtonListener(this);// buttonsContainer.addView(imageEditButton, buttonsContainer.getChildCount(), new RelativeLayout.LayoutParams(nSize, imbAddImage.getHeight())); buttonsContainer.addView(imageEditButton, buttonsContainer.getChildCount()); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageEditButton.getLayoutParams(); layoutParams.rightMargin = CommonUtil.dip2px(getContext(), 5); imageEditButton.setLayoutParams(layoutParams); imageEditButton.setImvHeightAndWidth(imbAddImage.getImvHeight(), imbAddImage.getImvWidth()); imageEditButton.displayUI(); // buttonsContainer.addView(imbAddImage, buttonsContainer.getChildCount()); // imbAddImage.setVisibility(buttonsContainer.getChildCount() <= totalImageQuantity ? VISIBLE : GONE); resetImageItemIndex(); }  public void doAddImage() { if (mEditListener != null) { mEditListener.doAddImage(); } } public void doEditLocalImage(ImageItem imageItem) { if (mEditListener != null) { mEditListener.doEditLocalImage(imageItem); } } public void doEditRemoteImage(RemoteImageItem remoteImageItem) { if (mEditListener != null) { mEditListener.doEditRemoteImage(remoteImageItem); } } // ----- public void setEditListener(ImageEditContainerListener editListener) { this.mEditListener = editListener; } // public interface ImageEditContainerListener { public void doAddImage(); public void doEditLocalImage(ImageItem imageItem1); public void doEditRemoteImage(RemoteImageItem remoteImageItem); }

关于Android中如何使用ImageEditContainer图片选择器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中如何使用ImageEditContainer图片选择器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中如何使用ImageEditContainer图片选择器

Android中如何使用ImageEditContainer图片选择器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 简介ImageEditButton 和 Image
2023-05-30

Android 图片选择器(超好用) ImageSelectorMore

由于项目需要,在GitHub上找了一些图片选择器的项目,轻松完成了需求,但是。。。 后面需求升级了,需要加入视频选择(可预览),后面有加上了 ‘ 图片标注 ’ 功能 这。。。 看了一下网上的项目,大都不支持视频,然后决定将之前用的 Imag
2022-06-06

如何在Android中使用ExFilePicker文件选择器

如何在Android中使用ExFilePicker文件选择器?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先需要在build.gradle添加引用:compi
2023-05-30

Flutter图片与文件选择器使用实例

这篇文章主要为大家介绍了Flutter图片与文件选择器使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-30

Android如何选择图片或视频进行循环播放

这篇文章主要介绍Android如何选择图片或视频进行循环播放,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!项目要求对本地图片或者视频进行轮播,功能实现完成后发现只是在模拟器上运行ok,后来发现是文件路径的原因。文件u
2023-05-30

如何在Android应用中利用ImageView实现一个选择本地图片功能

这期内容当中小编将会给大家带来有关如何在Android应用中利用ImageView实现一个选择本地图片功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。布局文件:
2023-05-31

Android中如何使用aFileChooser第三方文件选择器

Android中如何使用aFileChooser第三方文件选择器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1) 首先要配置Androidmanifest.xml文件:
2023-05-31

Spinner列表选择框如何在Android项目中使用

Spinner列表选择框如何在Android项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一 列表项数据实际运用当中,很多下拉列表项的数据实际是可知的,可以放在xml
2023-05-31

Dreamweaver中css选择器中的类如何使用

这篇文章主要介绍Dreamweaver中css选择器中的类如何使用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Dreamweaver中的css选择器是定义css规则首选需要选择的,css选择器主要有:类\id\标签
2023-06-08

css如何使用OWL选择器

这篇文章给大家分享的是有关css如何使用OWL选择器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用 “OWL选择器”使用通用选择器(universal selector)* 和相邻的兄弟选择器(adjacen
2023-06-27

CSS: hover选择器如何使用

这篇文章主要介绍“CSS: hover选择器如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“CSS: hover选择器如何使用”文章能帮助大家解决问题。定义和用法定义::hover 选择器用于
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录