Android 使用GridView+仿微信图片上传功能(附源代码)
由于工作要求最近在使用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+仿微信图片上传功能(附源代码)相关推荐
- Android开发之使用GridView+仿微信图片上传功能(附源代码)
前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021 .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 如果不知道如何上传 ...
- android点击加号,Android仿微信图片上传带加号且超过最大数隐藏功能
1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 ...
- android仿微信图片上传进度,android高仿微信发布动态(选择图片)
[实例简介]Android 超高仿微信图片选择器 [实例截图] [核心代码] public class MainActivity extends Activity implements OnImage ...
- [Android] 通过GridView仿微信动态添加本地图片
原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...
- android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...
一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下 "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...
- Android 多张图片展示,仿微信图片上传,可以选择多张图片
我们经常会遇到需要多张图片展示上传的需求 ,如图 这样的需求我已经遇到过多次,个人总结一下,希望大家多多指点,支持选择多张图片 布局:一个GridView <com.zuihou.drunken ...
- Android使用Retrofit技术仿微信图片上传,可以选择多张图片拍照上传
Android 仿照微信发说说,既能实现拍照,选图库,多图案上传 使用Retrofit技术. 使用方法:详见博客 http://blog.csdn.net/u010046908/article/det ...
最新文章
- 专家:物联网时代信息安全问题亟待各方携手破题
- HDU——2874 Connections between cities
- 【Groovy】编译时元编程 ( 利用注解进行 AST 语法树转换 | 定义注解并使用 GroovyASTTransformationClass 注明 AST 转换接口 | AST 转换接口实现 )
- 搞Java的年薪 40W 是什么水平?
- 奇怪的方式c语言,C语言中奇怪的C语言特性
- U3D SCENEMANAGER.LOADSCENE是半异步的
- java normalize_java – XPath normalize-space()返回一系列规范化字符串
- debug idea js_IntelliJ IDEA 配置chrome插件调试js代码 - 狂奔的熊二 - 博客园
- 作者:伍筱聪(1989-),女,中国科学院上海天文台助理工程师
- linux下的Tomcat启动
- macos必做的设置_如何在MacOS上设置PHP,CaddyServer和Kirby —以及为什么要这样做
- c#报错不实现接口成员_《C#程序设计》 习 题 集
- 吴恩达机器学习作业Python实现(三):多类分类和前馈神经网络
- 【实验报告】二 网络嗅探与欺骗
- 使用基于轮询的SQL数据缓存依赖
- html修改字体大小到10像素,ps怎么修改字体大小
- gmap 支持python吗_Python:地图上的标记标签使用gmap.marker_层使用hover_-tex选项不工作...
- 5G网络身份识别---详解5G-GUTI
- oracle loop面试题,oracle存储过程面试题
- 新的打卡地诞生!三星家电出没网红咖啡厅