由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传、拍照、本地选择、相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助。

直接上图,下面的图片就是点击“加号”后弹出的对话框,通过对话框可以根据自己需求进行相片选择。

项目结构:

下面直接上代码。

整体的布局文件activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/index"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="44dp"android:background="#24cf5f"android:orientation="horizontal" ><ImageViewandroid:id="@+id/back"android:layout_width="match_parent"android:layout_height="20dp"android:layout_gravity="center"android:layout_weight="5"android:src="@drawable/back" /><TextViewandroid:layout_width="fill_parent"android:layout_height="44dp"android:layout_weight="1"android:gravity="center"android:paddingRight="40dp"android:text="图片上传"android:textColor="#FFFFFF"android:textSize="30px" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:layout_weight="1"android:orientation="vertical" ><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="请选择上传的图片" /><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="(友情提示:图片最多可添加9张,点击可删除选择的图片)"android:textSize="18px" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#000000" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1" ><com.yihang.MyGridView.MyGridViewandroid:id="@+id/gridView"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"android:layout_weight="111"android:columnWidth="90dp"android:gravity="center"android:horizontalSpacing="5dp"android:numColumns="4"android:stretchMode="columnWidth"android:verticalSpacing="5dp" /></LinearLayout></LinearLayout></ScrollView><Buttonandroid:id="@+id/bt_submit"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="bottom"android:layout_weight="5.2"android:background="#24cf5f"android:text="上传"android:textColor="#FFFFFF"android:textSize="16sp" /></LinearLayout>

MainActivity

package com.yihang.activity;import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.widget.Toast;import com.yihang.dialog.MyDialog;
import com.yihang.dialog.MyDialog.OnButtonClickListener;
import com.yihang.photodemo.R;public class MainActivity extends Activity implements
OnButtonClickListener, OnItemClickListener{private MyDialog dialog;// 图片选择对话框public static final int NONE = 0;public static final int PHOTOHRAPH = 1;// 拍照public static final int PHOTOZOOM = 2; // 缩放public static final int PHOTORESOULT = 3;// 结果public static final String IMAGE_UNSPECIFIED = "image/*";private GridView gridView; // 网格显示缩略图private final int IMAGE_OPEN = 4; // 打开图片标记private String pathImage; // 选择图片路径private Bitmap bmp; // 导入临时图片private ArrayList<HashMap<String, Object>> imageItem;private SimpleAdapter simpleAdapter; // 适配器
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);/** 防止键盘挡住输入框 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan"* 希望动态调整高度 android:windowSoftInputMode="adjustResize"*/getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);// 锁定屏幕
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);setContentView(R.layout.activity_main);init();initData();}private void init() {gridView = (GridView) findViewById(R.id.gridView);gridView.setOnItemClickListener(this);dialog = new MyDialog(this);dialog.setOnButtonClickListener(this);// activity中调用其他activity中组件的方法LayoutInflater layout = this.getLayoutInflater();View view = layout.inflate(R.layout.layout_select_photo, null);}private void initData() {/** 载入默认图片添加图片加号*/bmp = BitmapFactory.decodeResource(getResources(),R.drawable.gridview_addpic); // 加号imageItem = new ArrayList<HashMap<String, Object>>();HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", bmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);}@Overridepublic void camera() {// TODO Auto-generated method stubIntent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp.jpg")));startActivityForResult(intent, PHOTOHRAPH);}@Overridepublic void gallery() {// TODO Auto-generated method stubIntent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);startActivityForResult(intent, IMAGE_OPEN);}@Overridepublic void cancel() {// TODO Auto-generated method stub
        dialog.cancel();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);if (resultCode == NONE)return;// 拍照if (requestCode == PHOTOHRAPH) {// 设置文件保存路径这里放在跟目录下File picture = new File(Environment.getExternalStorageDirectory()+ "/temp.jpg");startPhotoZoom(Uri.fromFile(picture));}if (data == null)return;// 处理结果if (requestCode == PHOTORESOULT) {Bundle extras = data.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");ByteArrayOutputStream stream = new ByteArrayOutputStream();photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0-100)压缩文件// 将图片放入gridview中HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", photo);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);simpleAdapter.notifyDataSetChanged();dialog.dismiss();}}// 打开图片if (resultCode == RESULT_OK && requestCode == IMAGE_OPEN) {startPhotoZoom(data.getData());}super.onActivityResult(requestCode, resultCode, data);}@Overrideprotected void onResume() {// TODO Auto-generated method stub
        super.onResume();if (!TextUtils.isEmpty(pathImage)) {Bitmap addbmp = BitmapFactory.decodeFile(pathImage);HashMap<String, Object> map = new HashMap<String, Object>();map.put("itemImage", addbmp);imageItem.add(map);simpleAdapter = new SimpleAdapter(this, imageItem,R.layout.griditem_addpic, new String[] { "itemImage" },new int[] { R.id.imageView1 });simpleAdapter.setViewBinder(new ViewBinder() {@Overridepublic boolean setViewValue(View view, Object data,String textRepresentation) {// TODO Auto-generated method stubif (view instanceof ImageView && data instanceof Bitmap) {ImageView i = (ImageView) view;i.setImageBitmap((Bitmap) data);return true;}return false;}});gridView.setAdapter(simpleAdapter);simpleAdapter.notifyDataSetChanged();// 刷新后释放防止手机休眠后自动添加pathImage = null;dialog.dismiss();}}@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position, long id) {// TODO Auto-generated method stubif (imageItem.size() == 10) { // 第一张为默认图片Toast.makeText(MainActivity.this, "图片数9张已满",Toast.LENGTH_SHORT).show();} else if (position == 0) { // 点击图片位置为+ 0对应0张图片// 选择图片
            dialog.show();// 通过onResume()刷新数据} else {dialog(position);}}/** Dialog对话框提示用户删除操作 position为删除图片位置*/protected void dialog(final int position) {AlertDialog.Builder builder = new Builder(MainActivity.this);builder.setMessage("确认移除已添加图片吗?");builder.setTitle("提示");builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();imageItem.remove(position);simpleAdapter.notifyDataSetChanged();}});builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});builder.create().show();}public void startPhotoZoom(Uri uri) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, IMAGE_UNSPECIFIED);intent.putExtra("crop", "true");// aspectX aspectY 是宽高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪图片宽高intent.putExtra("outputX", 64);intent.putExtra("outputY", 64);intent.putExtra("return-data", true);startActivityForResult(intent, PHOTORESOULT);}}

弹出的对话框(仿照微信来完成):MyDialog

package com.yihang.dialog;import com.yihang.photodemo.R;import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
/*** 对话框实现类* @author admin**/
public class MyDialog extends Dialog implements OnClickListener {public MyDialog(Context context) {super(context,R.style.myDialog);//初始化布局
                setContentView(R.layout.layout_select_photo);Window dialogWindow = getWindow();dialogWindow.setLayout(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);dialogWindow.setGravity(Gravity.BOTTOM);setCanceledOnTouchOutside(true);findViewById(R.id.btn_camera).setOnClickListener(this);findViewById(R.id.btn_gallery).setOnClickListener(this);findViewById(R.id.btn_cancel).setOnClickListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.btn_camera:onButtonClickListener.camera();break;case R.id.btn_gallery:onButtonClickListener.gallery();break;case R.id.btn_cancel:onButtonClickListener.cancel();break;default:break;}}/*** 按钮的监听器* @author Orathee* @date 2014年3月20日 下午4:28:39*/public interface OnButtonClickListener{void camera();void gallery();void cancel();}private OnButtonClickListener onButtonClickListener;public OnButtonClickListener getOnButtonClickListener() {return onButtonClickListener;}public void setOnButtonClickListener(OnButtonClickListener onButtonClickListener) {this.onButtonClickListener = onButtonClickListener;}}

对话框的布局文件:layout_select_photo.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="bottom"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="vertical"android:background="@drawable/btn_style_alert_dialog_background"android:padding="20dp"><TextViewandroid:id="@+id/btn_camera"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="18sp"android:background="@drawable/btn_style_alert_dialog_button"android:textColor="#0f0f0f"android:text="拍照"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#ffffff"android:layout_marginBottom="10dp"android:padding="10dp"android:gravity="center"/><TextViewandroid:id="@+id/btn_gallery"android:layout_width="fill_parent"android:layout_height="wrap_content"android:textSize="18sp"android:background="@drawable/btn_style_alert_dialog_button"android:textColor="#0f0f0f"android:text="从相册中选择"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#ffffff"android:layout_marginBottom="10dp"android:padding="10dp"android:gravity="center"/><TextViewandroid:id="@+id/btn_cancel"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/btn_style_alert_dialog_cancel"android:textColor="#ffffff"android:textSize="18sp"android:text="取消"android:shadowDx="0.5"android:shadowDy="0.5"android:shadowRadius="0.5"android:shadowColor="#000000"android:layout_marginTop="10dp"android:padding="10dp"android:gravity="center"/></LinearLayout>
</LinearLayout>

自定义的GridView

package com.yihang.MyGridView;import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;public class MyGridView extends GridView {public MyGridView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub
    }public MyGridView(Context context) {super(context);}public MyGridView(Context context, AttributeSet attrs, int defStyle) {super(context);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// TODO Auto-generated method stubint expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}
}

源代码下载地址:http://download.csdn.net/download/m0_38125535/9951649

转载于:https://www.cnblogs.com/zhujiabin/p/8434198.html

Android 使用GridView+仿微信图片上传功能(附源代码)相关推荐

  1. Android开发之使用GridView+仿微信图片上传功能(附源代码)

    前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021  .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...

  2. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...

  3. Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传

    仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 如果不知道如何上传 ...

  4. android点击加号,Android仿微信图片上传带加号且超过最大数隐藏功能

    1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 ...

  5. android仿微信图片上传进度,android高仿微信发布动态(选择图片)

    [实例简介]Android 超高仿微信图片选择器 [实例截图] [核心代码] public class MainActivity extends Activity implements OnImage ...

  6. [Android] 通过GridView仿微信动态添加本地图片

    原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...

  7. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

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

    我们经常会遇到需要多张图片展示上传的需求 ,如图 这样的需求我已经遇到过多次,个人总结一下,希望大家多多指点,支持选择多张图片 布局:一个GridView <com.zuihou.drunken ...

  9. Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传

    Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit技术. 使用方法:详见博客 http://blog.csdn.net/u010046908/article/det ...

最新文章

  1. 专家:物联网时代信息安全问题亟待各方携手破题
  2. HDU——2874 Connections between cities
  3. 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )
  4. 搞Java的年薪 40W 是什么水平?
  5. 奇怪的方式c语言,C语言中奇怪的C语言特性
  6. U3D SCENEMANAGER.LOADSCENE是半异步的
  7. java normalize_java – XPath normalize-space()返回一系列规范化字符串
  8. debug idea js_IntelliJ IDEA 配置chrome插件调试js代码 - 狂奔的熊二 - 博客园
  9. 作者:伍筱聪(1989-),女,中国科学院上海天文台助理工程师
  10. linux下的Tomcat启动
  11. macos必做的设置_如何在MacOS上设置PHP,CaddyServer和Kirby —以及为什么要这样做
  12. c#报错不实现接口成员_《C#程序设计》 习 题 集
  13. 吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络
  14. 【实验报告】二 网络嗅探与欺骗
  15. 使用基于轮询的SQL数据缓存依赖
  16. html修改字体大小到10像素,ps怎么修改字体大小
  17. gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
  18. 5G网络身份识别---详解5G-GUTI
  19. oracle loop面试题,oracle存储过程面试题
  20. 新的打卡地诞生!三星家电出没网红咖啡厅

热门文章

  1. 《实施Cisco统一通信管理器(CIPT1)》——2.2 CUCM:单站点部署模型
  2. 使用curl操作InfluxDB
  3. 图解字符串的朴素模式匹配算法
  4. lpk.dll病毒的现象和手工处理
  5. 吃火锅有四忌[转载]
  6. Qtum量子链应邀出席2019棉兰区块链沙龙进军东南亚市场第一站
  7. ES5原生api(2)
  8. Thread类(线程)
  9. 使用cpanel后台的“时钟守护作业”功能完成空间的定时全备份
  10. ECharts.js学习(三)