Android实现图片选择器功能

本文实例为大家分享了Android实现图片选择器功能的具体代码,供大家参考,具体内容如下

图片选择功能用的是GitHub上的依赖库,网址

先来看下我运行的效果图如下所示:

该依赖库是Android平台上拍照/录像,图片/视频选择,编辑和压缩的一站式解决方案。

添加依赖,在app->build.gradle里面添加依赖

//图片/视频选择、预览、编辑与拍照
implementation 'com.github.guoxiaoxing:phoenix:1.0.15'

初始化:

public class App extends Application {

  @Override
  public void onCreate() {
    super.onCreate();

    Phoenix.config()
        .imageLoader(new ImageLoader() {
          @Override
          public void loadImage(Context mContext, ImageView imageView
                        , String imagePath, int type) {
            Glide.with(mContext)
                .load(imagePath)
                .into(imageView);
          }
        });
  }
}

开启功能:

 private void callUpSelecter(boolean isCamera, int type, int REQUEST_CODE) {

    if (TextUtils.isEmpty(fileID)) {
      Phoenix.with()
          .theme(PhoenixOption.THEME_RED)// 主题
          .fileType(MimeType.ofImage())//显示的文件类型图片、视频、图片和视频
          .maxPickNumber(9)// 最大选择数量
          .minPickNumber(0)// 最小选择数量
          .spanCount(4)// 每行显示个数
          .enablePreview(true)// 是否开启预览
          .enableCamera(isCamera)// 是否开启拍照
          .enableAnimation(false)// 选择界面图片点击效果
          .enableCompress(true)// 是否开启压缩
          .compressPictureFilterSize(300)//多少kb以下的图片不压缩
          .compressVideoFilterSize(2018)//多少kb以下的视频不压缩
          .thumbnailHeight(160)// 选择界面图片高度
          .thumbnailWidth(160)// 选择界面图片宽度
          .enableClickSound(false)// 是否开启点击声音
          .pickedMediaList(add_lists)// 已选图片数据
          .videoFilterTime(0)//显示多少秒以内的视频
          .mediaFilterSize(0)//显示多少kb以下的图片/视频,默认为0,表示不限制
          .start(UploadMorePicActivity.this, type, REQUEST_CODE);
    }

  }

获取结果:

 @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 889 && resultCode == RESULT_OK) {//相册
      //返回的数据
      List<MediaEntity> result = Phoenix.result(data);
      Log.e("=====result==", result.toString());
      add_lists.clear();
      add_lists.addAll(result);
      adapter.updateItems(add_lists);
      btnOkEnable(add_lists);

    } else if (requestCode == 899 && resultCode == RESULT_OK) {//拍照
      List<MediaEntity> result = Phoenix.result(data);
      add_lists.addAll(result);
      adapter.updateItems(add_lists);
      btnOkEnable(add_lists);
    }
  }

recyclerView的适配基类:

/**
 * recyclerView适配器基类
 */
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  public OnRecyclerViewItemClickListener mOnItemClickListener = null;
  public OnRecyclerViewItemClickListenerData listenerData;

  /**
   * 数据集合
   */
  protected List<T> mItems;
  protected Context mContext;

  /**
   * 构造函数
   */
  public BaseRecyclerAdapter(Context context) {
    this.mContext = context;
    mItems = new ArrayList<>();
  }

  /**
   * 返回数据集
   */
  public List<T> getList() {
    return mItems;
  }

  /**
   * 添加单条数据
   */
  public void addItem(T item) {
    if (item == null) return;
    mItems.add(mItems.size(), item);
    notifyItemInserted(mItems.size());
  }

  /**
   * 追加数据集合
   */
  public void addItems(List<T> items) {
    if (items == null) return;
    this.mItems.addAll(items);

    notifyDataSetChanged();
  }

  public boolean containsAll(List<T> items) {
    return mItems.containsAll(items);
  }

  /**
   * 更新指定行数据
   */
  public void updateItem(T tasks, int position) {
    if (tasks == null) return;
    mItems.set(position, tasks);
    notifyItemChanged(position);
  }

  /**
   * 更新全部数据
   */
  public void updateItems(List<T> items) {
    if (items == null) return;
    this.mItems.clear();
    this.mItems.addAll(items);
    notifyDataSetChanged();
  }

  /**
   * 移除指定行数据
   */
  public void removeItem(int index) {
    mItems.remove(index);
    notifyItemRemoved(index);
    notifyItemRangeChanged((index - 1) >= 0 ? index - 1 : 0, mItems.size());
  }

  public void getView(int position, RecyclerView.ViewHolder viewHolder, int type, T item) {
  }

  /**
   * 返回指定行数据
   */
  public T getItem(int location) {
    if (mItems == null || mItems.isEmpty()) {
      return null;
    } else {
      return mItems.get(location);
    }
  }

  /**
   * 返回数据集合总数
   */
  @Override
  public int getItemCount() {
    return mItems == null ? 0 : mItems.size();
  }

  /**
   * 清除全部数据
   */
  public void clear() {
    mItems.clear();
    notifyDataSetChanged();
  }

  public static interface OnRecyclerViewItemClickListener {
    void onItemClick(View view, String data);
  }

  public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
    this.mOnItemClickListener = listener;
  }

  public interface OnRecyclerViewItemClickListenerData<T> {
    void onItemClickData(View view, T data);
  }

  public void setOnItemClickListenerData(OnRecyclerViewItemClickListenerData listener) {
    listenerData = listener;
  }
}

显示选择的图片的适配器:

/**
 * Created by YuShuangPing on 2018/7/16.
 */

public class UpLoadMorePicAdapter extends BaseRecyclerAdapter<MediaEntity> {
  /**
   * 构造函数
   *
   * @param context
   */
  public UpLoadMorePicAdapter(Context context) {
    super(context);
  }

  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(mContext).inflate(R.layout.item_upload_more_pic_refresh,parent,false);
    return new ViewHolder(view);
  }

  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (holder instanceof ViewHolder){
      final ViewHolder viewHolder= (ViewHolder) holder;
      if(mItems.size()<9&&position==mItems.size()){
        Glide.with(mContext).load(R.mipmap.add_consumer).centerCrop().into(viewHolder.iv_pic);

      }else{
        final MediaEntity mediaEntity=mItems.get(position);
          Glide.with(mContext).load(mediaEntity.getLocalPath()).centerCrop().into(viewHolder.iv_pic);
      }
      viewHolder.iv_pic.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          if (listenerData!=null){
            listenerData.onItemClickData(viewHolder.iv_pic,position);
          }
        }
      });

    }

  }

  @Override
  public int getItemCount() {
    return mItems.size()<9? mItems.size()+1:9;
  }

  class ViewHolder extends RecyclerView.ViewHolder{
    private CustomHeightImageView iv_pic;

    public ViewHolder(View view) {
      super(view);
      iv_pic= (CustomHeightImageView) view.findViewById(R.id.iv_pic);
    }
  }
}

适配器布局文件:

R.layout.item_upload_more_pic_refresh

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal">

  <com.sinosig.ygqd.widget.CustomHeightImageView
    android:id="@+id/iv_pic"
    android:layout_width="230px"
    android:layout_height="230px"
    android:layout_marginBottom="28.8px"
    app:scale="1" />
</LinearLayout>

Activity中的代码:

public class UploadMorePicActivity extends AppCompatActivity
{
 private RecyclerView rl_pic;
 private UpLoadMorePicAdapter adapter;
 private List<MediaEntity> add_lists = new ArrayList<>();

 @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 rl_pic = (RecyclerView) findViewById(R.id.rl_pic);
 adapter = new UpLoadMorePicAdapter(this);
 rl_pic.setLayoutManager(new GridLayoutManager(this, 4));
 rl_pic.setAdapter(adapter);
 adapter.updateItems(add_lists);
 adapter.setOnItemClickListenerData(new BaseRecyclerAdapter.OnRecyclerViewItemClickListenerData() {
      @Override
      public void onItemClickData(View view, Object data) {
        int position = (int) data;
        if (position >= add_lists.size()) {
          callUpSelecter(false, PhoenixOption.TYPE_PICK_MEDIA, 889);
        } else {
        }

      }
    });
}
private void callUpSelecter(boolean isCamera, int type, int REQUEST_CODE) {

    if (TextUtils.isEmpty(fileID)) {
      Phoenix.with()
          .theme(PhoenixOption.THEME_RED)// 主题
          .fileType(MimeType.ofImage())//显示的文件类型图片、视频、图片和视频
          .maxPickNumber(9)// 最大选择数量
          .minPickNumber(0)// 最小选择数量
          .spanCount(4)// 每行显示个数
          .enablePreview(true)// 是否开启预览
          .enableCamera(isCamera)// 是否开启拍照
          .enableAnimation(false)// 选择界面图片点击效果
          .enableCompress(true)// 是否开启压缩
          .compressPictureFilterSize(300)//多少kb以下的图片不压缩
          .compressVideoFilterSize(2018)//多少kb以下的视频不压缩
          .thumbnailHeight(160)// 选择界面图片高度
          .thumbnailWidth(160)// 选择界面图片宽度
          .enableClickSound(false)// 是否开启点击声音
          .pickedMediaList(add_lists)// 已选图片数据
          .videoFilterTime(0)//显示多少秒以内的视频
          .mediaFilterSize(0)//显示多少kb以下的图片/视频,默认为0,表示不限制
          .start(UploadMorePicActivity.this, type, REQUEST_CODE);
    }

  }
 @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 889 && resultCode == RESULT_OK) {//相册
      //返回的数据
      List<MediaEntity> result = Phoenix.result(data);
      Log.e("=====result==", result.toString());
      add_lists.clear();
      add_lists.addAll(result);
      adapter.updateItems(add_lists);
      btnOkEnable(add_lists);

    }

}

自定义ImageView:

public class CustomHeightImageView extends android.support.v7.widget.AppCompatImageView {
  float scale = 0;

  public CustomHeightImageView(Context context) {
    super(context);
  }

  public CustomHeightImageView(Context context, float scale) {
    super(context);
    this.scale = scale;
  }

  public CustomHeightImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CustomHeightRelativeLayout);
    scale = a.getFloat(R.styleable.CustomHeightRelativeLayout_scale, -1f);
//    float scale = a.
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (scale == -1) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    } else {
      super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(
          (int) (MeasureSpec.getSize(widthMeasureSpec) * (scale)),
          MeasureSpec.getMode(widthMeasureSpec)));
    }

  }
}

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

(0)

相关推荐

  • 浅谈谈Android 图片选择器

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

  • Android仿微信图片选择器

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

  • Android 高仿QQ图片选择器

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

  • Android ImageSelector微信图片选择器

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

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

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

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

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

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

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

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

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

  • Android仿微信朋友圈图片选择器

    最近做开发需要解决一个模仿微信朋友圈附加图片的功能,具体要求如下: (1)从手机中最多选择3张图片,可拍照上传: (2)选择的图片可以点击移除然后再添加新图片: (3)可以在手机包含图片的各个文件夹中随意选择等. 本博客主要实现的是以上功能,其他诸如主界面布局.各种控件添加和提交功能等旨在说明问题,只做了简单处理,重点在图片选择添加部分.该功能的实现主要引用了一个图片加载的开源框架universal-image-loader. 其中截图如下: 为了不过于冗余,过滤了部分布局文件和资源文件,在这里

  • Android仿微信照片选择器实现预览查看图片

    好了下面进入正题,我们先看一下实现效果吧: 下面来介绍一下代码: 本思路就是: 1.先到手机中扫描jpeg和png的图片 2.获取导图片的路径和图片的父路径名也就是文件夹名 3.将图片路径和文件夹名分别添加导数据源中 4.数据源有了就是显示了,文件夹显示是利用的popwindow,而图片显示则是GridView 看一下具体代码: 首先开启一个线程去扫描图片 /** * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 */

随机推荐