Android 多张图片展示,仿微信图片上传,可以选择多张图片

我们经常会遇到需要多张图片展示上传的需求 ,如图
这里写图片描述

这样的需求我已经遇到过多次,个人总结一下,希望大家多多指点,支持选择多张图片
这里写图片描述

布局:一个GridView

 <com.zuihou.drunkenmonkey.widget.view.DirectoryScrollGridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:numColumns="3"android:padding="@dimen/margin_8" />

点击从相册或相机选择图片出现弹框,弹框布局如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
        android:id="@+id/ll_popup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@color/homepage_type_bg"android:orientation="vertical"><LinearLayout
            android:layout_width="match_parent"android:layout_height="55dp"android:orientation="horizontal"><Button
                android:id="@+id/item_popupwindows_camera"android:layout_width="match_parent"android:layout_height="55dp"android:text="拍照"android:textColor="#585858"android:textSize="@dimen/font_16" /></LinearLayout><TextView
            android:layout_width="match_parent"android:layout_height="1px"android:layout_marginLeft="80dp"android:background="#f2f2f2" /><LinearLayout
            android:layout_width="match_parent"android:layout_height="55dp"android:orientation="horizontal"><Button
                android:id="@+id/item_popupwindows_Photo"android:layout_width="match_parent"android:layout_height="55dp"android:text="从相册中选取"android:textColor="#585858"android:textSize="@dimen/font_16" /></LinearLayout><TextView
            android:layout_width="match_parent"android:layout_height="2dp"android:background="#f3f3f3" /><Button
            android:id="@+id/item_popupwindows_cancel"android:layout_width="match_parent"android:layout_height="55dp"android:text="取消"android:textColor="#585858"android:textSize="@dimen/font_16" /></LinearLayout></RelativeLayout>

点击从相册或相机选择图片出现弹框,Activity代码:

 /*** 底部弹框选择类型*/private void pictureSelect() {View view = getLayoutInflater().inflate(R.layout.llj_item_popupwindows, null);// 设置style 控制默认dialog带来的边距问题final Dialog dialog = new Dialog(this, R.style.common_dialog);dialog.setContentView(view);dialog.show();Button camera = (Button) view.findViewById(R.id.item_popupwindows_camera);final Button photo = (Button) view.findViewById(R.id.item_popupwindows_Photo);Button cancel = (Button) view.findViewById(R.id.item_popupwindows_cancel);//手机拍照camera.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {photo();dialog.dismiss();}});//从手机选择photo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int selectedMode;selectedMode = MultiImageSelectorActivity.MODE_MULTI;int maxNum = 3 - drr.size();Intent intent = new Intent(AdviceActivity.this, MultiImageSelectorActivity.class);// 是否显示拍摄图片intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, false);// 最大可选择图片数量intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, maxNum);// 选择模式intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, selectedMode);startActivityForResult(intent, RESULT_LOAD_IMAGE);dialog.dismiss();}});cancel.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dialog.dismiss();}});// 设置相关位置,一定要在 show()之后Window window = dialog.getWindow();window.getDecorView().setPadding(0, 0, 0, 0);WindowManager.LayoutParams params = window.getAttributes();params.width = ViewGroup.LayoutParams.MATCH_PARENT;params.gravity = Gravity.BOTTOM;window.setAttributes(params);}

拍照:

/*** 拍照*/public void photo() {try {Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String sdcardState = Environment.getExternalStorageState();String sdcardPathDir = Environment.getExternalStorageDirectory().getPath() + "/tempImage/";File file = null;if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {// 有sd卡,是否有myImage文件夹File fileDir = new File(sdcardPathDir);if (!fileDir.exists()) {fileDir.mkdirs();}// 是否有headImg文件file = new File(sdcardPathDir + System.currentTimeMillis() + ".JPEG");}if (file != null) {path = file.getPath();photoUri = Uri.fromFile(file);openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);startActivityForResult(openCameraIntent, TAKE_PICTURE);}} catch (Exception e) {e.printStackTrace();}}

选择照片返回结果

 private static final int TAKE_PICTURE = 0;private static final int RESULT_LOAD_IMAGE = 1;private static final int CUT_PHOTO_REQUEST_CODE = 2;private String path = "";private Uri photoUri;@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case TAKE_PICTURE:if (drr.size() < 3 && resultCode == -1) {startPhotoZoom(photoUri);}break;case RESULT_LOAD_IMAGE:if (drr.size() < 3 && resultCode == RESULT_OK && null != data) {mSelectPath = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);Log.e("6666", ":" + mSelectPath);Bitmap bitmap;try {for (String p : mSelectPath) {Log.e("55555", p.toString());bitmap = Bimp.revitionImageSize(p.toString());PhotoActivity.bitmap.add(bitmap);bitmap = Bimp.createFramedPhoto(480, 480, bitmap, (int) (dp * 1.6f));bmp.add(bitmap);gridviewInit();//把图片数量添加进集合,方便删除,统计数量drr.add(FileUtils.SDPATH + ".JPEG");//把位图转化为字符流ByteArrayOutputStream baos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);baos.close();byte[] buffer = baos.toByteArray();String[] photoImgliu = new String[1024 * 1024];photoImgliu[i] = Base64.encodeToString(buffer, 0, buffer.length, Base64.DEFAULT);Log.e("666", "photoLiu" + i + ":" + photoImgliu[i]);i++;}} catch (IOException e) {e.printStackTrace();}}break;case CUT_PHOTO_REQUEST_CODE:if (resultCode == RESULT_OK && null != data) {Bitmap bitmap = Bimp.getLoacalBitmap(drr.get(drr.size() - 1));PhotoActivity.bitmap.add(bitmap);bitmap = Bimp.createFramedPhoto(480, 480, bitmap, (int) (dp * 1.6f));bmp.add(bitmap);gridviewInit();try {//把位图转化为字符流ByteArrayOutputStream baos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);baos.close();byte[] buffer = baos.toByteArray();String[] cameralImgliu = new String[1024 * 1024];cameralImgliu[i] = Base64.encodeToString(buffer, 0, buffer.length, Base64.DEFAULT);Log.e("666", "camearlLiu" + i + ":" + cameralImgliu[i]);i++;} catch (IOException e) {e.printStackTrace();}}break;default:break;}}

选取照片后截图:

 private void startPhotoZoom(Uri uri) {try {// 获取系统时间 然后将裁剪后的图片保存至指定的文件夹SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");String address = sDateFormat.format(new Date());if (!FileUtils.isFileExist("")) {FileUtils.createSDDir("");}drr.add(FileUtils.SDPATH + address + ".JPEG");Uri imageUri = Uri.parse("file:///sdcard/formats/" + address + ".JPEG");final Intent intent = new Intent("com.android.camera.action.CROP");// 照片URL地址intent.setDataAndType(uri, "image/*");intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);intent.putExtra("outputX", 480);intent.putExtra("outputY", 480);// 输出路径intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);// 输出格式intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());// 不启用人脸识别intent.putExtra("noFaceDetection", false);intent.putExtra("return-data", false);startActivityForResult(intent, CUT_PHOTO_REQUEST_CODE);} catch (IOException e) {e.printStackTrace();}}

适配器的代码如下:

/*** gridview适配器*/public class GridAdapter extends BaseAdapter {private LayoutInflater listContainer;private int selectedPosition = -1;private boolean shape;public boolean isShape() {return shape;}public void setShape(boolean shape) {this.shape = shape;}public class ViewHolder {public ImageView image;public Button bt;}public GridAdapter(Context context) {listContainer = LayoutInflater.from(context);}@Overridepublic int getCount() {if (bmp.size() < 3) {return bmp.size() + 1;} else {return bmp.size();}}@Overridepublic Object getItem(int arg0) {return null;}@Overridepublic long getItemId(int arg0) {return 0;}public void setSelectedPosition(int position) {selectedPosition = position;}public int getSelectedPosition() {return selectedPosition;}/*** ListView Item设置*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final int sign = position;GridAdapter.ViewHolder holder = null;if (convertView == null) {holder = new GridAdapter.ViewHolder();convertView = listContainer.inflate(R.layout.design_upload, null);holder.image = (ImageView) convertView.findViewById(R.id.img);holder.bt = (Button) convertView.findViewById(R.id.item_bt);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (position == bmp.size()) {holder.image.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_photo));holder.bt.setVisibility(View.GONE);if (position == 3) {holder.image.setVisibility(View.GONE);}} else {holder.image.setImageBitmap(bmp.get(position));holder.bt.setVisibility(View.VISIBLE);holder.bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {PhotoActivity.bitmap.remove(sign);bmp.get(sign).recycle();bmp.remove(sign);drr.remove(sign);gridviewInit();}});}return convertView;}}

源码可以下载,http://download.csdn.net/download/qq_23668969/10130344

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40514.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多图片文件上传实现并通过 PostMan 测试

2019独角兽企业重金招聘Python工程师标准>>> 项目的框架是springCloud 的一个服务&#xff0c;图片上传实际上就是用java的IO 流进行读写文件&#xff0c;给后台传递一个路径&#xff0c;后台通过浏览器链接到前端&#xff0c;将前端的图片数据拷贝的服务器的存储地…

小程序上传图片+Vant(可一次传多张图片)

需求&#xff1a;小程序端上传图片&#xff0c;可一次传多张照片、预览、删除。 问题&#xff1a;vant写的对我这种没有基础的人来说&#xff0c;确实有点头疼&#xff0c;参考了这篇参考链接&#xff0c;然后根据需求改了改。 实现结果&#xff1a; 代码&#xff1a; wxml:…

postman模拟上传图片

首先要选择post类型请求&#xff0c;然后选择Body&#xff0c;请求格式选择form-data&#xff0c;然后以key-value的格式传值&#xff0c;点击文件类型&#xff0c;选择file(默认为text)&#xff0c;然后选择要上传的文件就可以了。headers加enctypemultipart/form-data 然后在…

123.(后端)图片上传接口实现

1.概述 实现上传图片的接口 2.流程概述 2.1配置参数在config.py # config.py # 用于存放配置信息 # 用于导入加密字符 import os # 配置MySQL参数 class Config:ALLOWED_IMGS set([bmp,png,jpg,jpeg,gif])BASE_DIR os.path.dirname(os.path.abspath(__file__))SERVER_IM…

淘淘商城第27讲——实现图片上传功能

分析一下图片上传相关的前端页面 上文我们使用FastDFS-Client测试了一下简单的文件上传操作&#xff0c;淘淘商城项目中新增商品时上传图片的功能还没实现&#xff0c;如下图所示。本文将花大量笔墨来教大家如何实现图片上传这个功能。 我们来看下item-add.jsp页面&#xff0…

面试官:GET 请求能上传图片吗?我蒙了

前言 曾经遇到的面试题&#xff0c;觉得挺有意思&#xff0c;来说下我的答案及思考过程。 首先&#xff0c;我们要知道的是&#xff0c;图片一般有两种传输方式&#xff1a;base64和file对象。 base64 图片 图片的base64编码想必大家都见过&#xff1a; base64的本质是字符串…

面试:GET 请求能上传图片吗,已解决

转公众号&#xff1a; java大后端 前言 曾经遇到的面试题&#xff0c;觉得挺有意思&#xff0c;来说下我的答案及思考过程。 首先&#xff0c;我们要知道的是&#xff0c;图片一般有两种传输方式&#xff1a;base64 和 file对象。 base64 图片 图片的base64编码想必大家都…

微信小程序服务器请求和上传数据,上传图片并展示,提交表单完整实例代码附效果图

微信小程序开发交流qq群 173683895 、 526474645 &#xff1b; 承接微信小程序开发。扫码加微信。 为了方便大家&#xff0c;下面列出微信请求服务器常用的几种方式&#xff0c;并附上代码和注释。 一&#xff1a; GET请求&#xff08;最常用的&#xff09; wx.request(…

LeCun力荐!哈佛博士分享如何用GPT-4搞科研

编&#xff5c;桃子 源&#xff5c;新智元 排版 | 夕小瑶的卖萌屋 进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群) 用GPT-4搞科研未来或许成为每个人的标配&#xff0c;但是究竟如何高效利用LLM工具&#xff0c;还得需要技巧。近日&#xff0c;一位哈佛博士分…

LeCun力荐!哈佛博士分享用GPT-4搞科研,细到每个工作流程

【导读】用GPT-4搞科研未来或许成为每个人的标配&#xff0c;但是究竟如何高效利用LLM工具&#xff0c;还得需要技巧。近日&#xff0c;一位哈佛博士分享了自己的经验&#xff0c;还获得了LeCun的推荐。 GPT-4的横空出世&#xff0c;让许多人对自己的科研担忧重重&#xff0c;…

8月 | O'Reilly好书推荐[每月送书]

OReilly读者俱乐部联合图灵教育8月好书推荐&#xff01; 以下是小编为OReilly粉丝整理的一期OReilly书单&#xff0c;一共7本&#xff0c;包含各个领域&#xff0c;有基于Python的深度学习入门书&#xff0c;还有R数据科学领域传奇人物著作&#xff0c;有SQL经典书重新出版&…

冰河最新电子书上架第一天阅读量超15万,你值得拥有

大家好&#xff0c;我是冰河~~ 最近不是有小伙伴在问我为啥公众号的文章更新频率低了吗&#xff1f;今天就跟大家说一下吧&#xff0c;这不是最近在整理一本原创电子书吗&#xff1f;没错&#xff0c;这次是和阿里云开发者社区合作&#xff0c;在阿里云藏经阁上架了一本冰河的…

亚马逊kindle设置_如何让您的Amazon Echo大声朗读您的Kindle书

亚马逊kindle设置 Ever wish you could read your books while doing other stuff at the same time? Sure, you could listen to Audiobooks with Audible, but your Amazon Echo can also read your Kindle ebooks to you out loud. Here’s how. 曾经希望您可以在同时做其他…

Bookdown搭配GitHubPages发布电子书

文章目录 前言一、前期准备二、发布步骤1. bookdown项目1.1 安装R包1.2 新建project1.3 修改成自己的笔记 2. GitHubPages发布2.1 增加本地_bookdown.yml文件一行参数2.2 部署到GitHub2.3 修改GitHub仓库的一些属性 3. 成功 参考文章 前言 你想发布一本自己的电子书吗&#xf…

今天发现,不能从亚马逊买纸质图书了!!!

打算买一本纸质的书送人&#xff0c;搜了半天发现亚马逊全是电子书&#xff0c;虽然预料之中&#xff0c;但没想到还是来得太突然。其实我自己已经很久没买过纸质书了。 当年买第一本电纸书的时候&#xff0c;花了不到二十块钱&#xff0c;心疼的我要命。后来用习惯了&#xf…

不知道买啥绘本?适合3-6岁儿童的绘本书单,建议父母收藏

作为父母&#xff0c;给孩子选绘本&#xff0c;首要原则是&#xff0c;内容吸引人&#xff0c;让孩子能坐得住。我本人买过很多绘本&#xff0c;当然也有踩过坑&#xff0c;根据我自己买绘本的相关经验&#xff0c;结合我家孩子爱看的绘本&#xff0c;分享适合3-6岁孩子的绘本书…

Kindle在线推书网站 强烈推荐

俗话说得好&#xff1a;腹有诗书气自华 突然间发现自己的kindle已经吃灰好久了 有的时候还会当做泡面盖用用 但后来彻底废弃了 归结其原因还是书籍资源太少&#xff08;懒&#xff09; 因为之前找书实在太痛苦了 即使买了Amazon的Kindle Unlimited会员 依旧有找不到的书 甚是痛…

Datawhale 《南瓜书》

Datawhale 南瓜书 pumpkin-book 原书&#xff1a;机器学习 周志华 贡献者&#xff1a; Datawhale成员 欢迎任何人参与和完善&#xff1a;一个人可以走的很快&#xff0c;但是一群人却可以走的更远。 章节小节 每个chapter表示章节&#xff0c;part* 表示每个小节 pumpkin-boo…

90后在虚拟世界建国风园林,完美融合数字艺术与传统诗词

90后数字艺术家罗比(sheepmaomao)在虚拟世界中建起了一个个国风园林景象&#xff0c;如梦如幻。她对植物细致入微的观察&#xff0c;对数字技术游刃有余的运用和丰富的想象力&#xff0c;在屏幕艺术本身魅力的加持下&#xff0c;造就出令人叹为观止的作品。 罗比的数字植物柔和…

【新知实验室 TRTCIM】实时互动课堂最佳实践

【新知实验室 TRTC&IM】实时互动课堂最佳实践 一、新知实验室-TRTC腾讯云音视频产品体验官计划活动简介 二、产品简介TRTCIM 三、最佳实践3.1 官方快速上手TRTC(快速跑通)3.1.1 注册腾讯云账号3.1.2 使用实时音视频(需先开通)3.1.3 创建应用3.1.4 查看项目(查看密钥和快速上…