热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android实现图片选择器功能

这篇文章主要为大家详细介绍了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 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 result = Phoenix.result(data);
      add_lists.addAll(result);
      adapter.updateItems(add_lists);
      btnOkEnable(add_lists);
    }
  }

recyclerView的适配基类:

/**
 * recyclerView适配器基类
 */
public abstract class BaseRecyclerAdapter extends RecyclerView.Adapter {
  public OnRecyclerViewItemClickListener mOnItemClickListener= null;
  public OnRecyclerViewItemClickListenerData listenerData;
 
  /**
   * 数据集合
   */
  protected List mItems;
  protected Context mContext;
 
  /**
   * 构造函数
   */
  public BaseRecyclerAdapter(Context context) {
    this.mCOntext= context;
    mItems = new ArrayList<>();
  }
 
  /**
   * 返回数据集
   */
  public List getList() {
    return mItems;
  }
 
  /**
   * 添加单条数据
   */
  public void addItem(T item) {
    if (item == null) return;
    mItems.add(mItems.size(), item);
    notifyItemInserted(mItems.size());
  }
 
  /**
   * 追加数据集合
   */
  public void addItems(List items) {
    if (items == null) return;
    this.mItems.addAll(items);
 
    notifyDataSetChanged();
  }
 
  public boolean containsAll(List 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 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 &#63; 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 &#63; 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 {
    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 {
  /**
   * 构造函数
   *
   * @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&#63; 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

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  

Activity中的代码:

public class UploadMorePicActivity extends AppCompatActivity
{
 private RecyclerView rl_pic;
 private UpLoadMorePicAdapter adapter;
 private List 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 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)));
    }
 
  }
}

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


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
author-avatar
伤心脑残猪_940
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有