Android仿微信多图片选择,拍照等,适合快速导入到自己项目中

简介: 前段时间做项目需要用到图片选择,系统自带的intent方法选择图片已经过时了,不方便,所以就找到了一个大牛做的开源项目,拿过来修改了一下,添加了一些常用的功能,更加适合快速的集成到自己的项目中去,具体如下:类似微信从相册中选择图片或者拍照;可以控制单张或者多张选择;支持预览,并且在预览页面可以直接删除图片;选择图片后,在展示页面图片的右上角有删除按钮,点击可以直接

前段时间做项目需要用到图片选择,系统自带的intent方法选择图片已经过时了,不方便,所以就找到了一个大牛做的开源项目,拿过来修改了一下,添加了一些常用的功能,更加适合快速的集成到自己的项目中去,具体如下:

  1. 类似微信从相册中选择图片或者拍照;
  2. 可以控制单张或者多张选择;
  3. 支持预览,并且在预览页面可以直接删除图片;
  4. 选择图片后,在展示页面图片的右上角有删除按钮,点击可以直接删除;
  5. 更多属性可自行配置,适合快速集成到自己的项目中。

    直接上图片
    这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述这里写图片描述

用到的三个基本方法

/**
     * 预览
     *
     * @param position
     */
    public void previewPhoto(int position) {
        ImagePreviewActivity.startPreview(this, selectLocalMedias, selectLocalMedias, maxSelectNum, position);
    }

    /**
     * 进入相册中选择图片
     */
    public void pickerPhoto() {
        int mode = selectMode.getCheckedRadioButtonId() == R.id.mode_multiple ?
                ImageSelectorActivity.MODE_MULTIPLE : ImageSelectorActivity.MODE_SINGLE;
        boolean isShow = showCamera.getCheckedRadioButtonId() == R.id.camera_yes ? true : false;
        boolean isPreview = enablePreview.getCheckedRadioButtonId() == R.id.preview_enable ? true : false;
        boolean isCrop = enableCrop.getCheckedRadioButtonId() == R.id.crop_enable ? true : false;

        ImageSelectorActivity.start(MainActivity.this, maxSelectNum - selectedPhotos.size() + 1, spanCount, mode, isShow, isPreview, isCrop);
    }

    /**
     * 删除图片
     *
     * @param position
     */
    public void delPhoto(int position) {
        selectedPhotos.remove(position);
        selectLocalMedias.remove(position);
        if (selectedPhotos.size() < maxSelectNum) {
            // 保证最后一张是点击添加更多图片的
            selectedPhotos.add(addMoreImage);
        }
        gridAdapter.notifyDataSetChanged();
    }

以上的三个方法基本满足了需求,其中选择图片和图片预览都可以对图片进行操作,操作后的返回结果处理如下:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK && (requestCode == ImagePreviewActivity.REQUEST_CODE_PREVIEW
                || requestCode == ImageSelectorActivity.REQUEST_CODE_PICKER)) {
            if (data != null) {

                ArrayList<String> images = (ArrayList<String>) data.getSerializableExtra(ImageSelectorActivity.REQUEST_OUTPUT);
                List<LocalMedia> localMedias = new ArrayList<>();
                for (String image : images) {
                    LocalMedia localMedia = new LocalMedia(image);
                    localMedias.add(localMedia);
                }
                Log.i("TAG", "localMedias.size = " + localMedias.size());
                if (requestCode == ImagePreviewActivity.REQUEST_CODE_PREVIEW) {
                    selectedPhotos.clear();
                    selectLocalMedias.clear();
                } else if (requestCode == ImageSelectorActivity.REQUEST_CODE_PICKER) {
                    selectedPhotos.remove(addMoreImage);
                }
                if (images != null) {
                    selectedPhotos.addAll(images);
                    selectLocalMedias.addAll(localMedias);
                }
                if (selectedPhotos.size() < maxSelectNum) {
                    // 保证最后一张是点击添加更多图片的
                    selectedPhotos.add(addMoreImage);
                }
                gridAdapter.notifyDataSetChanged();
            }
        }
    }

其中,对于选择之后图片的展示,单独写了一个adapter,里面的关键代码如下

@Override
    public void onBindViewHolder(GridAdapter.ViewHolder holder, final int position) {
        if (images.get(position).equals("addMoreImage")) {
            // 添加更多图片
            holder.imageView.setImageResource(R.drawable.btn_addphoto);
            holder.imageViewDel.setVisibility(View.GONE);
            holder.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // 非常棒的写法
                    if (mContext instanceof MainActivity) {
                        ((MainActivity) mContext).pickerPhoto();
                    }
                }
            });
        } else {
            // 点击图片
            Glide.with(mContext)
                    .load(new File(images.get(position)))
                    .centerCrop()
                    .into(holder.imageView);
            holder.imageViewDel.setVisibility(View.VISIBLE);
            holder.imageViewDel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 非常棒的写法
                    if (mContext instanceof MainActivity) {
                        ((MainActivity) mContext).delPhoto(position);
                    }
                }
            });
            holder.imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    // 非常棒的写法
                    if (mContext instanceof MainActivity) {
                        ((MainActivity) mContext).previewPhoto(position);
                    }
                }
            });
        }
    }

这里因为要增加一个点击添加更多图片的功能,所以额外的增加了一个addMoreImage的图片路径,在具体使用的时候,需要特别留意。
备注:
个人感觉微信的图片选择有一个地方做的不太人性化,就是如果选择了两张图片,再次点击选择图片按钮的时候,没有把已经选择的这两张图片传递到图片选择页面,导致会出现重复选择的问题,试了一下,没有修复成功,有兴趣的小伙伴可以fork一下,推送给我。
欢迎大家交流沟通,下面是github地址: https://github.com/BrillantZhao/photoPicker

相关文章
|
3月前
|
XML Java Android开发
微信虚拟视频插件安卓,微信虚拟相机替换拍照,java源码分享
完整的相机应用项目包含三个主要文件:主活动实现、布局文件和清单文件。代码实现了相机预览、
|
17天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
3月前
|
Android开发 数据安全/隐私保护
手机微信虚拟视频聊天,安卓免root虚拟摄像头,免root虚拟hook相机
以上代码实现了一个完整的免root虚拟摄像头方案,通过Hook系统摄像头服务和微信视频通话接口
|
5月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
231 3
Android利用selector(选择器)实现图片动态点击效果
|
3月前
|
API Android开发
微信虚拟摄像头模块,微信虚拟视频聊天,安卓虚拟摄像头插件
该实现包含虚拟摄像头服务核心、视频流生成和Android配置三个关键模块,使用Camera2
|
5月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
165 8
|
5月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
181 1
|
7月前
|
安全 算法 小程序
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
396 28
【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
|
9月前
|
人工智能 自然语言处理
使用企业微信或公众号自动回复图片消息
AppFlow支持企业微信和公众号接收图片消息,并提供两种回复方式。方式一:直接回复图片消息,用户发送图片后立即收到回复,但无法继续追问。方式二:先保存图片,待用户发送文字后再一并处理并回复。配置步骤包括选择模板、配置鉴权信息、设置执行动作参数及发布连接流。详细操作可参考相关文档。
811 1
使用企业微信或公众号自动回复图片消息
|
12月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
1844 3

热门文章

最新文章