我的编程空间,编程开发者的网络收藏夹
学习永远不晚

[Android] 通过GridView仿微信动态添加本地图片示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

[Android] 通过GridView仿微信动态添加本地图片示例代码

前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器,而是调用SimpleAdapter实现的.至于上传发布与网络交互此处不讲述,后面文章会讲!

一. 实现效果

主要是通过点击+从本地相册中添加图片,同时显示图片至GridView.点击图片可以进行删除操作,同时界面中的发布EditView控件也很好看,不足之处在于+好没有移动至最后,但原理相同.

    

二. 项目工程结构

三. 界面布局详细代码

1.主界面activity_main.xml

主要通过相对布局实现,第一部分是底部的TextView,中间是EditView和GridView相对布局,下面是两个按钮.同时EditView调用res/drawable-hdpi中的editview_shape.xml,GridView显示的每张图片通过griditem_addpic.xml实现.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:tools="http://schemas.android.com/tools" 
  android:id="@+id/container" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  tools:context="com.example.suishoupaipublish.MainActivity" 
  tools:ignore="MergeRootFrame" > 
  <!-- 顶部添加文字 -->  
  <RelativeLayout  
    android:id="@+id/Layout_top"  
    android:orientation="horizontal"   
    android:layout_width="fill_parent"  
    android:layout_height="40dp"  
    android:layout_marginTop="5dp" 
    android:layout_alignParentTop="true"  
    android:gravity="center">  
    <TextView  
      android:layout_width="fill_parent"   
      android:layout_height="wrap_content"   
      android:textSize="25sp" 
      android:gravity="center" 
      android:text="发布信息" />  
  </RelativeLayout>  
  <!-- 底部按钮 -->  
  <RelativeLayout  
    android:id="@+id/Layout_bottom"   
    android:layout_alignParentBottom="true" 
    android:layout_width="fill_parent"   
    android:layout_height="50dp" 
    android:gravity="center" >  
    <Button  
      android:id="@+id/button1"  
      android:layout_width="wrap_content"  
      android:layout_height="fill_parent" 
      android:textSize="20sp" 
      android:text="发布拍拍" />  
    <Button  
      android:id="@+id/button2"  
      android:layout_width="wrap_content"  
      android:layout_height="fill_parent" 
      android:layout_toRightOf="@+id/button1" 
      android:textSize="20sp" 
      android:text="取消发布" /> 
  </RelativeLayout>  
  <!-- 显示图片 -->  
  <RelativeLayout  
    android:id="@+id/Content_Layout"    
    android:layout_width="fill_parent"   
    android:layout_height="fill_parent"  
    android:layout_above="@id/Layout_bottom"   
    android:layout_below="@id/Layout_top"   
    android:gravity="center">    
    <LinearLayout   
      android:layout_width="match_parent"  
      android:layout_height="match_parent"  
      android:orientation="vertical" 
      android:layout_alignParentBottom="true" >  
      <!-- 设置运行多行 设置圆角图形 黑色字体--> 
      <EditText  
        android:id="@+id/editText1" 
        android:layout_height="120dp" 
        android:layout_width="fill_parent" 
        android:textColor="#000000" 
        android:layout_margin="12dp" 
        android:textSize="20sp" 
        android:hint="随手说出你此刻的心声..." 
        android:maxLength="500" 
        android:singleLine="false" 
        android:background="@drawable/editview_shape" /> 
      <!-- 网格显示图片 行列间距5dp 每列宽度90dp --> 
      <GridView 
        android:id="@+id/gridView1" 
        android:layout_width="fill_parent" 
        android:layout_height="200dp" 
        android:layout_margin="10dp" 
        android:background="#EFDFDF" 
        android:horizontalSpacing="5dp" 
        android:verticalSpacing="5dp" 
        android:numColumns="4" 
        android:columnWidth="90dp" 
        android:stretchMode="columnWidth" 
        android:gravity="center" > 
      </GridView> 
      <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)" 
        android:gravity="center" /> 
    </LinearLayout> 
  </RelativeLayout> 
</RelativeLayout> 

2.显示ImageView图片布局griditem_addpic.xml


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:gravity="center" 
  android:descendantFocusability="blocksDescendants" 
  android:orientation="vertical" > 
  <RelativeLayout 
    android:layout_gravity="center" 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:orientation="vertical" > 
    <ImageView 
      android:layout_marginTop="10dp" 
      android:layout_marginRight="10dp" 
      android:id="@+id/imageView1" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:scaleType="fitXY" 
      android:class="lazy" data-src="@drawable/gridview_addpic" /> 
  </RelativeLayout> 
</LinearLayout> 

3.设置EditView控件圆角和颜色 editview_shape.xml


<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"  
  android:shape="rectangle"  
  android:padding="10dp"> 
  <!-- 填充editView的颜色 --> 
  <soild android:color="#ffffff"/> 
  <!-- 设置圆角的弧度,radius半径越大,editView的边角越圆 --> 
  <corners  
    android:radius="15dp" 
    android:bottomRightRadius="15dp" 
    android:bottomLeftRadius="15dp" 
    android:topLeftRadius="15dp"  
    android:topRightRadius="15dp"/> 
  <stroke 
    android:color="#32CD32"  
    android:width="4px" />  
</shape> 

四. 代码详解

它主要是思想如下:

1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作.

2.当点击加号图片(+)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage.

3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片.

4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除.

具体代码如下所示:


public class MainActivity extends Activity { 
  private GridView gridView1;       //网格显示缩略图 
  private Button buttonPublish;      //发布按钮 
  private final int IMAGE_OPEN = 1;    //打开图片标记 
  private String pathImage;        //选择图片路径 
  private Bitmap bmp;           //导入临时图片 
  private ArrayList<HashMap<String, Object>> imageItem; 
  private SimpleAdapter simpleAdapter;   //适配器 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
     
    getWindow().setSoftInputMode(WindowManager.LayoutParams. 
        SOFT_INPUT_ADJUST_PAN); 
    //锁定屏幕 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.activity_main); 
    //获取控件对象 
    gridView1 = (GridView) findViewById(R.id.gridView1); 
     
    //获取资源图片加号 
    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() {  
      @Override  
      public boolean setViewValue(View view, Object data,  
          String textRepresentation) {  
        // TODO Auto-generated method stub  
        if(view instanceof ImageView && data instanceof Bitmap){  
          ImageView i = (ImageView)view;  
          i.setImageBitmap((Bitmap) data);  
          return true;  
        }  
        return false;  
      } 
    });  
    gridView1.setAdapter(simpleAdapter); 
     
    gridView1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
      { 
        if( imageItem.size() == 10) { //第一张为默认图片 
          Toast.makeText(MainActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show(); 
        } 
        else if(position == 0) { //点击图片位置为+ 0对应0张图片 
          Toast.makeText(MainActivity.this, "添加图片", Toast.LENGTH_SHORT).show(); 
          //选择图片 
          Intent intent = new Intent(Intent.ACTION_PICK,     
              android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
          startActivityForResult(intent, IMAGE_OPEN);  
          //通过onResume()刷新数据 
        } 
        else { 
          dialog(position); 
          //Toast.makeText(MainActivity.this, "点击第"+(position + 1)+" 号图片",  
          //   Toast.LENGTH_SHORT).show(); 
        } 
      } 
    });  
  } 
  //获取图片路径 响应startActivityForResult  
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    super.onActivityResult(requestCode, resultCode, data);     
    //打开图片  
    if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) {     
      Uri uri = data.getData();  
      if (!TextUtils.isEmpty(uri.getAuthority())) {  
        //查询选择图片  
        Cursor cursor = getContentResolver().query(  
            uri,  
            new String[] { MediaStore.Images.Media.DATA },  
            null,   
            null,   
            null);  
        //返回 没找到选择图片  
        if (null == cursor) {  
          return;  
        }  
        //光标移动至开头 获取图片路径  
        cursor.moveToFirst();  
        pathImage = cursor.getString(cursor  
            .getColumnIndex(MediaStore.Images.Media.DATA));  
      } 
    } //end if 打开图片 
  } 
  //刷新图片 
  @Override 
  protected void onResume() { 
    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() {  
        @Override  
        public boolean setViewValue(View view, Object data,  
            String textRepresentation) {  
          // TODO Auto-generated method stub  
          if(view instanceof ImageView && data instanceof Bitmap){  
            ImageView i = (ImageView)view;  
            i.setImageBitmap((Bitmap) data);  
            return true;  
          }  
          return false;  
        } 
      });  
      gridView1.setAdapter(simpleAdapter); 
      simpleAdapter.notifyDataSetChanged(); 
      //刷新后释放防止手机休眠后自动添加 
      pathImage = null; 
    } 
  } 
   
  protected void dialog(final int position) { 
    AlertDialog.Builder builder = new Builder(MainActivity.this); 
    builder.setMessage("确认移除已添加图片吗?"); 
    builder.setTitle("提示"); 
    builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        imageItem.remove(position); 
        simpleAdapter.notifyDataSetChanged(); 
      } 
    }); 
    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
        } 
      }); 
    builder.create().show(); 
  } 
} 

同时需要在AndroidMainfest.xml中添加权限操作SD卡和网络上传至服务器.


<!-- 申明网络权限 --> 
<uses-permission android:name="android.permission.INTERNET" /> 
<!-- 申明权限 操作SD卡 -->  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

五. 总结

该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示.

这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法.

demo下载地址:http://xiazai.jb51.net/201701/yuanma/GirdViewTest_jb51.rar

您可能感兴趣的文章:Android仿微信朋友圈添加图片的实例代码Android仿微信朋友圈点击加号添加图片功能Android GridView扩展仿微信微博发图动态添加删除图片功能


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

[Android] 通过GridView仿微信动态添加本地图片示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

[Android] 通过GridView仿微信动态添加本地图片示例代码

前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述GridView控件实现添加本地图片并显示.主要是关于GridView控件的基本操作,通常可以通过自定义继承BaseAdapter的适配器加载图片,而下面讲述的不是自定义的适配器
2022-06-06

Android仿微信朋友圈添加图片的实例代码

老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧!在项目中这种添加图片上传的效果应该是非常常见的,后面有个添加的按钮应该让有些童鞋不知道咋办了吧,其实没那么复杂,通过GridVi
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录