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

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

微信

微信

微信

微信

下载地址 : 微信上传图片源码

很多网友不知道怎么获取图片路径,这里贴出来:

String path = Bimp.tempSelectBitmap.get(position).getImagePath();

//部分代码如下

[java] view plain copy

  1. package com.king.photo.activity;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.graphics.Color;
  9. import android.graphics.drawable.BitmapDrawable;
  10. import android.graphics.drawable.ColorDrawable;
  11. import android.os.Bundle;
  12. import android.os.Handler;
  13. import android.os.Message;
  14. import android.provider.MediaStore;
  15. import android.util.Log;
  16. import android.view.Gravity;
  17. import android.view.KeyEvent;
  18. import android.view.LayoutInflater;
  19. import android.view.View;
  20. import android.view.View.OnClickListener;
  21. import android.view.ViewGroup;
  22. import android.view.ViewGroup.LayoutParams;
  23. import android.view.animation.AnimationUtils;
  24. import android.widget.AdapterView;
  25. import android.widget.AdapterView.OnItemClickListener;
  26. import android.widget.BaseAdapter;
  27. import android.widget.Button;
  28. import android.widget.GridView;
  29. import android.widget.ImageView;
  30. import android.widget.LinearLayout;
  31. import android.widget.PopupWindow;
  32. import android.widget.RelativeLayout;
  33. import com.king.photo.R;
  34. import com.king.photo.util.Bimp;
  35. import com.king.photo.util.FileUtils;
  36. import com.king.photo.util.ImageItem;
  37. import com.king.photo.util.PublicWay;
  38. import com.king.photo.util.Res;
  39. //首页面activity
  40. public class MainActivity extends Activity {
  41. private GridView noScrollgridview;
  42. private GridAdapter adapter;
  43. private View parentView;
  44. private PopupWindow pop = null;
  45. private LinearLayout ll_popup;
  46. public static Bitmap bimap ;
  47. protected void onCreate(Bundle savedInstanceState) {
  48. super.onCreate(savedInstanceState);
  49. Res.init(this);
  50. bimap = BitmapFactory.decodeResource(
  51. getResources(),
  52. R.drawable.icon_addpic_unfocused);
  53. PublicWay.activityList.add(this);
  54. parentView = getLayoutInflater().inflate(R.layout.activity_selectimg, null);
  55. setContentView(parentView);
  56. Init();
  57. }
  58. public void Init() {
  59. pop = new PopupWindow(MainActivity.this);
  60. View view = getLayoutInflater().inflate(R.layout.item_popupwindows, null);
  61. ll_popup = (LinearLayout) view.findViewById(R.id.ll_popup);
  62. pop.setWidth(LayoutParams.MATCH_PARENT);
  63. pop.setHeight(LayoutParams.WRAP_CONTENT);
  64. pop.setBackgroundDrawable(new BitmapDrawable());
  65. pop.setFocusable(true);
  66. pop.setOutsideTouchable(true);
  67. pop.setContentView(view);
  68. RelativeLayout parent = (RelativeLayout) view.findViewById(R.id.parent);
  69. Button bt1 = (Button) view
  70. .findViewById(R.id.item_popupwindows_camera);
  71. Button bt2 = (Button) view
  72. .findViewById(R.id.item_popupwindows_Photo);
  73. Button bt3 = (Button) view
  74. .findViewById(R.id.item_popupwindows_cancel);
  75. parent.setOnClickListener(new OnClickListener() {
  76. @Override
  77. public void onClick(View v) {
  78. // TODO Auto-generated method stub
  79. pop.dismiss();
  80. ll_popup.clearAnimation();
  81. }
  82. });
  83. bt1.setOnClickListener(new OnClickListener() {
  84. public void onClick(View v) {
  85. photo();
  86. pop.dismiss();
  87. ll_popup.clearAnimation();
  88. }
  89. });
  90. bt2.setOnClickListener(new OnClickListener() {
  91. public void onClick(View v) {
  92. Intent intent = new Intent(MainActivity.this,
  93. AlbumActivity.class);
  94. startActivity(intent);
  95. overridePendingTransition(R.anim.activity_translate_in, R.anim.activity_translate_out);
  96. pop.dismiss();
  97. ll_popup.clearAnimation();
  98. }
  99. });
  100. bt3.setOnClickListener(new OnClickListener() {
  101. public void onClick(View v) {
  102. pop.dismiss();
  103. ll_popup.clearAnimation();
  104. }
  105. });
  106. noScrollgridview = (GridView) findViewById(R.id.noScrollgridview);
  107. noScrollgridview.setSelector(new ColorDrawable(Color.TRANSPARENT));
  108. adapter = new GridAdapter(this);
  109. adapter.update();
  110. noScrollgridview.setAdapter(adapter);
  111. noScrollgridview.setOnItemClickListener(new OnItemClickListener() {
  112. public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
  113. long arg3) {
  114. if (arg2 == Bimp.tempSelectBitmap.size()) {
  115. Log.i("ddddddd", "----------");
  116. ll_popup.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.activity_translate_in));
  117. pop.showAtLocation(parentView, Gravity.BOTTOM, 0, 0);
  118. } else {
  119. Intent intent = new Intent(MainActivity.this,
  120. GalleryActivity.class);
  121. intent.putExtra("position", "1");
  122. intent.putExtra("ID", arg2);
  123. startActivity(intent);
  124. }
  125. }
  126. });
  127. }
  128. @SuppressLint("HandlerLeak")
  129. public class GridAdapter extends BaseAdapter {
  130. private LayoutInflater inflater;
  131. private int selectedPosition = -1;
  132. private boolean shape;
  133. public boolean isShape() {
  134. return shape;
  135. }
  136. public void setShape(boolean shape) {
  137. this.shape = shape;
  138. }
  139. public GridAdapter(Context context) {
  140. inflater = LayoutInflater.from(context);
  141. }
  142. public void update() {
  143. loading();
  144. }
  145. public int getCount() {
  146. if(Bimp.tempSelectBitmap.size() == 9){
  147. return 9;
  148. }
  149. return (Bimp.tempSelectBitmap.size() + 1);
  150. }
  151. public Object getItem(int arg0) {
  152. return null;
  153. }
  154. public long getItemId(int arg0) {
  155. return 0;
  156. }
  157. public void setSelectedPosition(int position) {
  158. selectedPosition = position;
  159. }
  160. public int getSelectedPosition() {
  161. return selectedPosition;
  162. }
  163. public View getView(int position, View convertView, ViewGroup parent) {
  164. ViewHolder holder = null;
  165. if (convertView == null) {
  166. convertView = inflater.inflate(R.layout.item_published_grida,
  167. parent, false);
  168. holder = new ViewHolder();
  169. holder.image = (ImageView) convertView
  170. .findViewById(R.id.item_grida_image);
  171. convertView.setTag(holder);
  172. } else {
  173. holder = (ViewHolder) convertView.getTag();
  174. }
  175. if (position ==Bimp.tempSelectBitmap.size()) {
  176. holder.image.setImageBitmap(BitmapFactory.decodeResource(
  177. getResources(), R.drawable.icon_addpic_unfocused));
  178. if (position == 9) {
  179. holder.image.setVisibility(View.GONE);
  180. }
  181. } else {
  182. holder.image.setImageBitmap(Bimp.tempSelectBitmap.get(position).getBitmap());
  183. }
  184. return convertView;
  185. }
  186. public class ViewHolder {
  187. public ImageView image;
  188. }
  189. Handler handler = new Handler() {
  190. public void handleMessage(Message msg) {
  191. switch (msg.what) {
  192. case 1:
  193. adapter.notifyDataSetChanged();
  194. break;
  195. }
  196. super.handleMessage(msg);
  197. }
  198. };
  199. public void loading() {
  200. new Thread(new Runnable() {
  201. public void run() {
  202. while (true) {
  203. if (Bimp.max == Bimp.tempSelectBitmap.size()) {
  204. Message message = new Message();
  205. message.what = 1;
  206. handler.sendMessage(message);
  207. break;
  208. } else {
  209. Bimp.max += 1;
  210. Message message = new Message();
  211. message.what = 1;
  212. handler.sendMessage(message);
  213. }
  214. }
  215. }
  216. }).start();
  217. }
  218. }
  219. public String getString(String s) {
  220. String path = null;
  221. if (s == null)
  222. return "";
  223. for (int i = s.length() - 1; i > 0; i++) {
  224. s.charAt(i);
  225. }
  226. return path;
  227. }
  228. protected void onRestart() {
  229. adapter.update();
  230. super.onRestart();
  231. }
  232. private static final int TAKE_PICTURE = 0x000001;
  233. public void photo() {
  234. Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  235. startActivityForResult(openCameraIntent, TAKE_PICTURE);
  236. }
  237. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  238. switch (requestCode) {
  239. case TAKE_PICTURE:
  240. if (Bimp.tempSelectBitmap.size() < 9 && resultCode == RESULT_OK) {
  241. String fileName = String.valueOf(System.currentTimeMillis());
  242. Bitmap bm = (Bitmap) data.getExtras().get("data");
  243. FileUtils.saveBitmap(bm, fileName);
  244. ImageItem takePhoto = new ImageItem();
  245. takePhoto.setBitmap(bm);
  246. Bimp.tempSelectBitmap.add(takePhoto);
  247. }
  248. break;
  249. }
  250. }
  251. public boolean onKeyDown(int keyCode, KeyEvent event) {
  252. if (keyCode == KeyEvent.KEYCODE_BACK) {
  253. for(int i=0;i<PublicWay.activityList.size();i++){
  254. if (null != PublicWay.activityList.get(i)) {
  255. PublicWay.activityList.get(i).finish();
  256. }
  257. }
  258. System.exit(0);
  259. }
  260. return true;
  261. }
  262. }

下载地址 : 微信上传图片源码

备份下载地址:http://download.csdn.net/detail/jdsjlzx/8486449

补充:

通过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实现.

[html] view plaincopy

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/container"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. tools:context="com.example.suishoupaipublish.MainActivity"
  7. tools:ignore="MergeRootFrame" >
  8. <!-- 顶部添加文字 -->
  9. <RelativeLayout
  10. android:id="@+id/Layout_top"
  11. android:orientation="horizontal"
  12. android:layout_width="fill_parent"
  13. android:layout_height="40dp"
  14. android:layout_marginTop="5dp"
  15. android:layout_alignParentTop="true"
  16. android:gravity="center">
  17. <TextView
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:textSize="25sp"
  21. android:gravity="center"
  22. android:text="发布信息" />
  23. </RelativeLayout>
  24. <!-- 底部按钮 -->
  25. <RelativeLayout
  26. android:id="@+id/Layout_bottom"
  27. android:layout_alignParentBottom="true"
  28. android:layout_width="fill_parent"
  29. android:layout_height="50dp"
  30. android:gravity="center" >
  31. <Button
  32. android:id="@+id/button1"
  33. android:layout_width="wrap_content"
  34. android:layout_height="fill_parent"
  35. android:textSize="20sp"
  36. android:text="发布拍拍" />
  37. <Button
  38. android:id="@+id/button2"
  39. android:layout_width="wrap_content"
  40. android:layout_height="fill_parent"
  41. android:layout_toRightOf="@+id/button1"
  42. android:textSize="20sp"
  43. android:text="取消发布" />
  44. </RelativeLayout>
  45. <!-- 显示图片 -->
  46. <RelativeLayout
  47. android:id="@+id/Content_Layout"
  48. android:layout_width="fill_parent"
  49. android:layout_height="fill_parent"
  50. android:layout_above="@id/Layout_bottom"
  51. android:layout_below="@id/Layout_top"
  52. android:gravity="center">
  53. <LinearLayout
  54. android:layout_width="match_parent"
  55. android:layout_height="match_parent"
  56. android:orientation="vertical"
  57. android:layout_alignParentBottom="true" >
  58. <!-- 设置运行多行 设置圆角图形 黑色字体-->
  59. <EditText
  60. android:id="@+id/editText1"
  61. android:layout_height="120dp"
  62. android:layout_width="fill_parent"
  63. android:textColor="#000000"
  64. android:layout_margin="12dp"
  65. android:textSize="20sp"
  66. android:hint="随手说出你此刻的心声..."
  67. android:maxLength="500"
  68. android:singleLine="false"
  69. android:background="@drawable/editview_shape" />
  70. <!-- 网格显示图片 行列间距5dp 每列宽度90dp -->
  71. <GridView
  72. android:id="@+id/gridView1"
  73. android:layout_width="fill_parent"
  74. android:layout_height="200dp"
  75. android:layout_margin="10dp"
  76. android:background="#EFDFDF"
  77. android:horizontalSpacing="5dp"
  78. android:verticalSpacing="5dp"
  79. android:numColumns="4"
  80. android:columnWidth="90dp"
  81. android:stretchMode="columnWidth"
  82. android:gravity="center" >
  83. </GridView>
  84. <TextView
  85. android:layout_width="fill_parent"
  86. android:layout_height="wrap_content"
  87. android:text="(友情提示:只能添加9张图片,长按图片可以删除已添加图片)"
  88. android:gravity="center" />
  89. </LinearLayout>
  90. </RelativeLayout>
  91. </RelativeLayout>

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

[html] view plaincopy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:gravity="center"
  6. android:descendantFocusability="blocksDescendants"
  7. android:orientation="vertical" >
  8. <RelativeLayout
  9. android:layout_gravity="center"
  10. android:layout_width="80dp"
  11. android:layout_height="80dp"
  12. android:orientation="vertical" >
  13. <ImageView
  14. android:layout_marginTop="10dp"
  15. android:layout_marginRight="10dp"
  16. android:id="@+id/imageView1"
  17. android:layout_width="fill_parent"
  18. android:layout_height="fill_parent"
  19. android:scaleType="fitXY"
  20. android:src="@drawable/gridview_addpic" />
  21. </RelativeLayout>
  22. </LinearLayout>

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

[html] view plaincopy

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

四. 代码详解

    它主要是思想如下:
    1.通过SimpleAdapter适配器实现实现加载图片,在gridView1.setOnItemClickListener()点击函数中响应不同操作.
    2.当点击加号图片(+)时,调用本地相册通过Intent实现获取图片路径存于字符串pathImage.
    3.获取图片路径后在onResume中刷新图片,通过GridView的setAdapter()和notifyDataSetChanged()()函数刷新加载图片.
    4.点击图片时会获取其position,通过dialog()函数弹出对话框提示是否删除,通过remove实现删除.
    具体代码如下所示:

[java] view plaincopy

  1. public class MainActivity extends Activity {
  2. private GridView gridView1;              //网格显示缩略图
  3. private Button buttonPublish;            //发布按钮
  4. private final int IMAGE_OPEN = 1;        //打开图片标记
  5. private String pathImage;                //选择图片路径
  6. private Bitmap bmp;                      //导入临时图片
  7. private ArrayList<HashMap<String, Object>> imageItem;
  8. private SimpleAdapter simpleAdapter;     //适配器
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. /*
  14. * 防止键盘挡住输入框
  15. * 不希望遮挡设置activity属性 android:windowSoftInputMode="adjustPan"
  16. * 希望动态调整高度 android:windowSoftInputMode="adjustResize"
  17. */
  18. getWindow().setSoftInputMode(WindowManager.LayoutParams.
  19. SOFT_INPUT_ADJUST_PAN);
  20. //锁定屏幕
  21. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  22. setContentView(R.layout.activity_main);
  23. //获取控件对象
  24. gridView1 = (GridView) findViewById(R.id.gridView1);
  25. /*
  26. * 载入默认图片添加图片加号
  27. * 通过适配器实现
  28. * SimpleAdapter参数imageItem为数据源 R.layout.griditem_addpic为布局
  29. */
  30. //获取资源图片加号
  31. bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gridview_addpic);
  32. imageItem = new ArrayList<HashMap<String, Object>>();
  33. HashMap<String, Object> map = new HashMap<String, Object>();
  34. map.put("itemImage", bmp);
  35. imageItem.add(map);
  36. simpleAdapter = new SimpleAdapter(this,
  37. imageItem, R.layout.griditem_addpic,
  38. new String[] { "itemImage"}, new int[] { R.id.imageView1});
  39. /*
  40. * HashMap载入bmp图片在GridView中不显示,但是如果载入资源ID能显示 如
  41. * map.put("itemImage", R.drawable.img);
  42. * 解决方法:
  43. *              1.自定义继承BaseAdapter实现
  44. *              2.ViewBinder()接口实现
  45. *  参考 http://blog.csdn.net/admin_/article/details/7257901
  46. */
  47. simpleAdapter.setViewBinder(new ViewBinder() {
  48. @Override
  49. public boolean setViewValue(View view, Object data,
  50. String textRepresentation) {
  51. // TODO Auto-generated method stub
  52. if(view instanceof ImageView && data instanceof Bitmap){
  53. ImageView i = (ImageView)view;
  54. i.setImageBitmap((Bitmap) data);
  55. return true;
  56. }
  57. return false;
  58. }
  59. });
  60. gridView1.setAdapter(simpleAdapter);
  61. /*
  62. * 监听GridView点击事件
  63. * 报错:该函数必须抽象方法 故需要手动导入import android.view.View;
  64. */
  65. gridView1.setOnItemClickListener(new OnItemClickListener() {
  66. @Override
  67. public void onItemClick(AdapterView<?> parent, View v, int position, long id)
  68. {
  69. if( imageItem.size() == 10) { //第一张为默认图片
  70. Toast.makeText(MainActivity.this, "图片数9张已满", Toast.LENGTH_SHORT).show();
  71. }
  72. else if(position == 0) { //点击图片位置为+ 0对应0张图片
  73. Toast.makeText(MainActivity.this, "添加图片", Toast.LENGTH_SHORT).show();
  74. //选择图片
  75. Intent intent = new Intent(Intent.ACTION_PICK,
  76. android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  77. startActivityForResult(intent, IMAGE_OPEN);
  78. //通过onResume()刷新数据
  79. }
  80. else {
  81. dialog(position);
  82. //Toast.makeText(MainActivity.this, "点击第"+(position + 1)+" 号图片",
  83. //      Toast.LENGTH_SHORT).show();
  84. }
  85. }
  86. });
  87. }
  88. //获取图片路径 响应startActivityForResult
  89. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  90. super.onActivityResult(requestCode, resultCode, data);
  91. //打开图片
  92. if(resultCode==RESULT_OK && requestCode==IMAGE_OPEN) {
  93. Uri uri = data.getData();
  94. if (!TextUtils.isEmpty(uri.getAuthority())) {
  95. //查询选择图片
  96. Cursor cursor = getContentResolver().query(
  97. uri,
  98. new String[] { MediaStore.Images.Media.DATA },
  99. null,
  100. null,
  101. null);
  102. //返回 没找到选择图片
  103. if (null == cursor) {
  104. return;
  105. }
  106. //光标移动至开头 获取图片路径
  107. cursor.moveToFirst();
  108. pathImage = cursor.getString(cursor
  109. .getColumnIndex(MediaStore.Images.Media.DATA));
  110. }
  111. }  //end if 打开图片
  112. }
  113. //刷新图片
  114. @Override
  115. protected void onResume() {
  116. super.onResume();
  117. if(!TextUtils.isEmpty(pathImage)){
  118. Bitmap addbmp=BitmapFactory.decodeFile(pathImage);
  119. HashMap<String, Object> map = new HashMap<String, Object>();
  120. map.put("itemImage", addbmp);
  121. imageItem.add(map);
  122. simpleAdapter = new SimpleAdapter(this,
  123. imageItem, R.layout.griditem_addpic,
  124. new String[] { "itemImage"}, new int[] { R.id.imageView1});
  125. simpleAdapter.setViewBinder(new ViewBinder() {
  126. @Override
  127. public boolean setViewValue(View view, Object data,
  128. String textRepresentation) {
  129. // TODO Auto-generated method stub
  130. if(view instanceof ImageView && data instanceof Bitmap){
  131. ImageView i = (ImageView)view;
  132. i.setImageBitmap((Bitmap) data);
  133. return true;
  134. }
  135. return false;
  136. }
  137. });
  138. gridView1.setAdapter(simpleAdapter);
  139. simpleAdapter.notifyDataSetChanged();
  140. //刷新后释放防止手机休眠后自动添加
  141. pathImage = null;
  142. }
  143. }
  144. /*
  145. * Dialog对话框提示用户删除操作
  146. * position为删除图片位置
  147. */
  148. protected void dialog(final int position) {
  149. AlertDialog.Builder builder = new Builder(MainActivity.this);
  150. builder.setMessage("确认移除已添加图片吗?");
  151. builder.setTitle("提示");
  152. builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
  153. @Override
  154. public void onClick(DialogInterface dialog, int which) {
  155. dialog.dismiss();
  156. imageItem.remove(position);
  157. simpleAdapter.notifyDataSetChanged();
  158. }
  159. });
  160. builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
  161. @Override
  162. public void onClick(DialogInterface dialog, int which) {
  163. dialog.dismiss();
  164. }
  165. });
  166. builder.create().show();
  167. }
  168. }

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

[html] view plaincopy

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

五. 总结

    

    该文章需要注意一个地方:在使用SimpleAdapter适配器加载bmp图片时,可能在GridView中不显示.即HashMap中map.put("itemImage",bmp)不显示图片,而使用put装入R.drawable.img却能显示.
    这时有两种解决方法,一种是自定义继承BaseAdapter的适配器实现;另一种方法则是如上所示通过ViewBinder()接口实现,感谢博主dmin_提供的方法.
    下载地址:http://download.csdn.net/detail/eastmount/8237429

 

时间: 2024-11-05 21:00:36

Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等的相关文章

Android高仿微信图片选择上传工具

源码托管地址:https://github.com/SleepyzzZ/photo-selector 话不多说,先上效果图(高仿微信图片选择器): 图片选择界面: 图片预览界面: 批量上传图片: 实现的功能介绍: 1.图片异步加载,使用Glide开源库实现加载; 2.图片的预览界面,支持左右滑动,双击放大浏览; 3.图片批量上传,使用OkHttp来实现与Servlet服务器的通信; 使用方法(Android Studio): 新建工程,File->New->Import Module导入pho

android之使用GridView+仿微信图片上传功能(附源代码)

由于工作要求最近在使用GridView完成图片的批量上传功能,我的例子当中包含仿微信图片上传.拍照.本地选择.相片裁剪等功能,如果有需要的朋友可以看一下,希望我的实际经验能对您有所帮助. 直接上图,下面的图片就是点击"加号"后弹出的对话框,通过对话框可以根据自己需求进行相片选择. 项目结构: 下面直接上代码. 整体的布局文件activity_main.xml 1 <LinearLayout xmlns:android="http://schemas.android.co

Android 高仿微信图片选择器(瀑布流)

前言 在很多很多的项目中,都有选择本地图片的功能,现在就带大家做一个仿微信的图片选择器 1.和微信相比,由于博主是平板,微信在博主的平板中的图片是很模糊的,而我们的这个比微信的清晰,但是代价基本就是内存的多消耗,但是现在的收集基本上这点内存还是有的,图片也是经过压缩的 2.和鸿洋封装的相比,有些人可能会说和大神的有可比性么?我可以很直白的说这个图片选择器就是参考鸿洋大神以前封装的图片选择器,并且进行代码的分层.逻辑的重新梳理.优化显示效果.去除很多难懂的代码,用浅显易懂的代码实现之!,并且图片的

【Android 仿微信通讯录 导航分组列表-上】使用ItemDecoration为RecyclerView打造带悬停头部的分组列表

[Android 仿微信通讯录 导航分组列表-上]使用ItemDecoration为RecyclerView打造带悬停头部的分组列表 一 概述 本文是Android导航分组列表系列上,因时间和篇幅原因分上下,最终上下合璧,完整版效果如下: 上部残卷效果如下:两个ItemDecoration,一个实现悬停头部分组列表功能,一个实现分割线(官方demo) 网上关于实现带悬停分组头部的列表的方法有很多,像我看过有主席的自定义ExpandListView实现的,也看过有人用一个额外的父布局里面套 Rec

Android 高级UI设计笔记06:仿微信图片选择器

仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache) (2)用户操作UI控件必须充分的流畅. a. getView里面尽可能不去做耗时的操作(异步加载 + 回调显示) (3)用户预期显示的图片尽可能的快(图片的加载策略的选择,一般选择是LIFO). a. LIFO 2. 定义一个Imageloader完成上面1中的3个目标: Imageloader

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView Universalimageloader 图片下载缓存库 https://github.com/nostra13/Android-Universal-Image-Loader ViewPagerIndicator 分页指示器 https://github.com/JakeWharton/Android-ViewPagerIndicat

Android 仿微信朋友圈发动态功能(相册图片多选)

代码分享 代码名称: 仿微信朋友圈发动态功能(相册图片多选) 代码描述: 仿微信朋友圈发动态功能(相册图片多选) 代码托管地址: http://www.apkbus.com/android-152760-1-1.html 代码作者: 楼主 代码效果图: 本帖最后由 ^.^ 于 2014-7-8 16:23 编辑 <ignore_js_op> <ignore_js_op> <ignore_js_op> DEMO一共13个类 大约2000行代码,童鞋们耐心点看基本思路是:1

[转]Android 超高仿微信图片选择器 图片该这么加载

快速加载本地图片缩略图的方法: Android 超高仿微信图片选择器 图片该这么加载 其示例下载: 仿微信图片选择器 ImageLoader

Android仿微信UI布局视图(圆角布局的实现)

圆角按钮,或布局可以在xml文件中实现,但也可以使用图片直接达到所需的效果,以前版本的微信就使用了这种方法. 实现效果图:    不得不说,这种做法还是比较方便的. 源代码: MainActivity(没写任何代码,效果全在布局文件中实现): package com.android_settings; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity