Android图片选择器ImageEditContainer

1. 简介

本次demo中一共封装了两个组件:ImageEditButton 和 ImageEditContainer。其中ImageEditContainer 是在 ImageEditButton,两个组件可单独使用。

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

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

2.项目主目录结构

3. 功能介绍

MainActivity.java 界面效果图:

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);
  }
 }
 }

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

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

图片可拖拽,缩放

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

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();
 }
 }
 }

使用的压缩方法:

 /**
 * Compress by quality, and generate image to the path specified
 *
 * @param imgPath
 * @param outPath
 * @param maxSize target will be compressed to be smaller than this size.(kb)
 * @param needsDelete Whether delete original file after compress
 * @throws IOException
 */
 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 添加图片方法介绍:

可添加本地和网络图片

 /**
 * 添加本地图片
 * List<String> storePaths 本地图片路径数组
 */
 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. 组件代码

1.ImageEditButton.java

/**
 * Created by dingzuoqiang on 2017/6/20.
 * Email: 530858106@qq.com
 */
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);
 }

}

2.ImageEditContainer.java

/**
 * Created by dingzuoqiang on 2017/6/20.
 * Email: 530858106@qq.com
 */
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;
 }

 /*
 删除一个 ImageItem
 */
 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();

 }

 /*
 ImageEditButton listener
 */

 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);
 }

项目下载:ImageEditContainer

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现底部图片选择Dialog

    业务需要选择弹出对话框,然后点击选择图片.网上已经有了很多,不过感觉写的有点乱.自己这里总结一下,有需要开发者可以按照如下步骤直接使用即可. 1.效果图如下 点击选择照相后,弹出如下选择对话框: 2. Dialog实现 布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:la

  • Android图片选择器 丰富的配置选项

    最近也是刚好项目用到,于是就动手写了一个Android 图片选择器的库.支持图库多选/单选/图片裁剪/拍照/自定义图片加载库,极大程度的简化使用. 截图 优点 1.通过实现ImageLoader接口,可以实现自定义图片加载器的功能.例如可以用Glide.Picasso.ImageLoader,暂不支持Fresco,因为SimpleDraweeView本身并不属于ImageView.当然,也可用相同的思路来实现. 2.可配置的ImgSelConfig.方便进行扩展. 3.简化使用 项目地址:htt

  • Android 图片选择详解及实例代码

     Android 图片选择 可以达到的效果: 1.第一个图片的位置放照相机,点击打开照相机 2.其余的是显示全部存储的图片,点击一次是查看大图,长按则是每张图片出现一个checkBox,可以进行选择 下面是实例效果图 MainActivity 类 public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener, AdapterView.OnItemLongClickLis

  • Android实现本地图片选择及预览缩放效果

    在做项目时经常会遇到选择本地图片的需求,以前都是懒得写直接调用系统方法来选择图片,但是这样并不能实现多选效果,最近又遇到了,所以还是写一个demo好了,以后也方便使用.还是首先来看看效果: 显示的图片使用RecyclerView实现的,利用Glide来加载:下面弹出的图片文件夹效果是采用PopupWindow实现,这里比采用PopupWindow更方便,弹出显示的左边图片是这个文件夹里的第一张图片:选中的图片可以进行预览,使用网上一个大神写的来实现的:至于图片的获取是用ContentProvid

  • Android 高仿QQ图片选择器

    当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了图片选择功能,放弃了系统提供的图片选择器,这里仿造QQ做了一个本地图片选择器,PS:之前有人说"仿"写成"防"了,今儿特意注意了下,求不错. 先上一张效果图,无图无真相啊~~~ 实现的效果大概是这样的: 1.单选:跳转到本地图片选择文件夹,选择文件夹后,进入到该文件夹下

  • 浅谈谈Android 图片选择器

    ImageSelector 简介 Android自定义相册,实现了拍照.图片选择(单选/多选).ImageLoader无绑定 任由开发者选择 https://github.com/YancyYe/ImageSelector Demo Download Apk 更新内容 UI重改 所有功能可配置 解决OOM情况 图片手动选择 支持汉语和英语 截图展示 使用说明 步骤一: 通过Gradle抓取 dependencies { compile 'com.yancy.imageselector:image

  • 分享实现Android图片选择的两种方式

    Android选择图片的两种方式: 第一种:单张选取 通过隐式启动activity,跳转到相册选择一张返回结果 关键代码如下: 发送请求: private static final int PICTURE = 10086; //requestcode Intent intent = new Intent(); if (Build.VERSION.SDK_INT < 19) {//因为Android SDK在4.4版本后图片action变化了 所以在这里先判断一下 intent.setAction

  • Android仿微信图片选择器

    很多项目要用到图片选择控件,每次都要写一大堆逻辑.于是基于图片选择组件(PhotoPicker)封装了一个控件PhotoUploadView.方便简易,一键集成,几句代码就可以添加类似微信的图片选择控件了.下面介绍一下该控件有些什么特点以及怎么使用.先看图: 效果如上图,点击加号弹出选择框,目前提供了两种形式,一个如图所见的PopupWindow,另一个是MaterialDialog,选择拍照或者从图库获取,从图库获取后就进入图二,选择完之后就图三或图四这里因为很多项目需要不一样,所以特别封装了

  • Android自定义View实现多图片选择控件

    前言 相信很多朋友在开发中都会遇到图片上传的情况,尤其是多图上传,最经典的莫过于微信的图片选择了.所有很多情况下会使用到多图选择,所以就有了这篇文章,今天抽点时间写了个控件.  •支持自定义选择图片的样式  •支持设置图片选择数量  •支持图片预览,删除  •支持图片拍照 先来看看效果 实现分析 假如不定义控件,我们要实现这样一个功能,无非是写个GridView在item点击的时候去显示图片进行选择,在返回界面的时候进行GridView的数据刷新.我们把这些逻辑写在我们自定义的GridView中

  • Android图片选择器ImageEditContainer

    1. 简介 本次demo中一共封装了两个组件:ImageEditButton 和 ImageEditContainer.其中ImageEditContainer 是在 ImageEditButton,两个组件可单独使用. 在demo中,实现了 图片选择(拍照+本地),裁剪,压缩,保存本地 以及对已选择图片的删除操作(如果有修改需求,也可以使用对应方法进行操作,该方法已添加): 还有就是 针对 6.0权限的处理问题,本次使用了第三方库 rxpermissions 进行权限的处理. 2.项目主目录结

  • Android仿微信图片选择器ImageSelector使用详解

    今天给大家介绍一个仿微信的图片选择器:ImageSelector.ImageSelector支持图片的单选.限数量的多选和不限数量的多选.支持图片预览和图片文件夹的切换.在上一篇文章 <Android 实现一个仿微信的图片选择器> 中我介绍了ImageSelector的实现思路和分析了它的核心代码,有兴趣的同学可以看一下.完整的代码放在了GitHub,欢迎大家下载和使用.本篇文章为大家介绍ImageSelector的具体使用方式. 先上效果图: 1.引入依赖 在Project的build.gr

  • Android ImageSelector微信图片选择器

    前言 现在绝大多数的App都上传图片的功能,比如设置用户头像.聊天发送图片.发表动态.论坛帖子等.上传图片需要先从选择手机中选择要上传的图片,所以图片选择器在App中是很常见的组件,一般的手机都会自带一个图片选择器.不过很多App并不喜欢用手机自带的选择器,而是自己实现一个图片选择器. 比如微信的图片选择器就做的很好.没办法,谁让微信这么强大,我不超抄袭你,但是,我可以模仿你. 效果图 是不是和真的一样,哈哈,不过,作者的唯一缺陷就是没有提供拍照,唉,有一点遗憾,但是,这个就够用了! 思路 1.

  • Android实现图片选择器功能

    本文实例为大家分享了Android实现图片选择器功能的具体代码,供大家参考,具体内容如下 图片选择功能用的是GitHub上的依赖库,网址 先来看下我运行的效果图如下所示: 该依赖库是Android平台上拍照/录像,图片/视频选择,编辑和压缩的一站式解决方案. 添加依赖,在app->build.gradle里面添加依赖 //图片/视频选择.预览.编辑与拍照 implementation 'com.github.guoxiaoxing:phoenix:1.0.15' 初始化: public clas

  • Android实现微信的图片选择器

    现在大部分的App都上传图片的功能,比如设置用户头像.聊天发送图片.发表动态.论坛帖子等.上传图片需要先从选择手机中选择要上传的图片,所以图片选择器在App中是很常见的组件,一般的手机都会自带一个图片选择器.不过很多App并不喜欢用手机自带的选择器,而是自己实现一个图片选择器.比如微信的图片选择器就做的很好.所以我也仿照微信的样式和交互效果,自己做了一个图片选择器:ImageSelector.ImageSelector支持图片的单选.限数量的多选和不限数量的多选.支持图片预览和图片文件夹的切换.

  • Android PicSelector图片选择器小功能

    本文实例为大家分享了Android实现图片选择器小功能的具体代码,供大家参考,具体内容如下 效果预览 实现 需要用到的库 compile 'com.squareup.picasso:picasso:2.3.2' compile 'com.android.support:appcompat-v7:26.1.0' 图片选择器大概思路: - 使用Content Provider获取存储器中的图片文件路径,以及所在文件夹,并存储到相应List中 - 使用RecyclerView制作网格视图,并用Pica

  • Android自定义图片选择器简单版

    前言:图片选择器基本上是每个App必备的东西,用公认好的第三方也可以,但是自己写的改起来方便,用起来顺手,而且这东西想想可能没动手之前想想比较难,实际操作起来就很简单了,这次先主要写流程,具体优化的细节以后在写. 难点:动手之前最困惑的问题就是怎么获取到手机里所有的图片,获取到之后,显示出来,处理逻辑这些就简单了. 步骤1:动态申请权限 private boolean permissionOpen() { if (ContextCompat.checkSelfPermission(this, M

随机推荐