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

微信

微信

微信

微信

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

//部分代码如下

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

  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

  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

  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实现删除.
    具体代码如下所示:
  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卡和网络上传至服务器.

  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

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

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

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

  2. javascript上传多张图片并预览

    直接上代码 html代码 <div> <label>封面</label> <input type="file" id="cove ...

  3. 基于“formData批量上传的多种实现” 的多图片预览、上传的多种实现

    前言 图片上传是web项目常见的需求,我基于之前的博客的代码(请戳:formData批量上传的多种实现)里的第三种方法实现多图片的预览.上传,并且支持三种方式添加图片到上传列表:选择图片.复制粘贴图片 ...

  4. 原生js实现图片预览并上传

    最近主导的PC客户端网站重构工程告一段落,下一阶段开始给公司APP开发H5页面,技术栈是react.最近碰到一个需求:需要在H5页面上添加身份证照片,预览并上传.因为要兼容安卓4.4以下版本的手机,所 ...

  5. 用js实现预览待上传的本地图片

    js实现预览待上传的本地图片,代码如下: <form name="form5" id="form5" method="post" ac ...

  6. .net core版 文件上传/ 支持批量上传,拖拽以及预览,bootstrap fileinput上传文件

    asp.net mvc请移步 mvc文件上传支持批量上传,拖拽以及预览,文件内容校验 本篇内容主要解决.net core中文件上传的问题  开发环境:ubuntu+vscode 1.导入所需要的包:n ...

  7. java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载

    java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载 实现功能:zip文件上传,后台自动解压,Jstree树目录(遍历文件),editor.md预览 采用Spring+Sp ...

  8. 玩转Android Camera开发(二):使用TextureView和SurfaceTexture预览Camera 基础拍照demo

    Google自Android4.0出了TextureView,为什么推出呢?就是为了弥补Surfaceview的不足,另外一方面也是为了平衡GlSurfaceView,当然这是本人揣度的.关于Text ...

  9. Azure SQL 数据库的灵活缩放预览版简介

    Eron Kelly SQL Server 产品管理部门产品市场营销总经理 几天前,我们宣布了发布 Azure SQL 数据库的灵活缩放公共预览版.新增的灵活缩放功能通过简化开发和管理,简化了扩展和缩 ...

  10. 【转】玩转Android Camera开发(三):国内首发---使用GLSurfaceView预览Camera 基础拍照demo

    http://blog.csdn.net/yanzi1225627/article/details/33339965 GLSurfaceView是OpenGL中的一个类,也是可以预览Camera的,而 ...

随机推荐

  1. libipq —— iptables用户空间数据包排队库

    LIBIPQ(3) NAMElibipq —— iptables用户空间数据包排队库 SYNOPSIS #include <linux/netfilter.h>#include <l ...

  2. C++ const修饰函数、函数参数、函数返回值

    const修饰函数 在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数.为什么不能调用非const函数?因为非const函数可能修改数据成员,cons ...

  3. SQL技巧之分类汇总

    数据表结构username type numaaaa   玉米 1212aaaa   玉米  212bbb     小麦  2323bbb .... 只有两种产品 玉米和小麦,玉米价格1.5,小麦价格 ...

  4. cx_Oracle ORA-24315: 非法的属性类型的解决办法

    网上查找原因说: 出现该错误的原因是因为版本不兼容. 检查了一下python版本和oracle 的版本,我的oracle client是10g的,python的版本是2.7, 但我安装的cx_orac ...

  5. CentOS 6.X更新Python2.7.x版本 安装pip

    在安装新版之前安装 先安装bz2.zlib,执行下列代码进行安装 yum install -y zlib-devel bzip2-devel xz-libs wget openssl openssl- ...

  6. C语言字符知识狭区

    C语言字符在用户接口软件编程上经常用到,但是有一些狭区会让编程出现一些小BUG,现在总结与此. 1.'\\' 代表的是字符\,而'\'是不能代表字符\的.通常\后面都要跟上数字或者其他字母来表示一个特 ...

  7. 关于 js 2个数组取差集怎么取

    关于 js 2个数组取差集怎么取? 例如求var arr1 = [1]; var arr2 = [1,2];的差集方法一: Array.prototype.diff = function(a) { r ...

  8. Python的字符串操作和Unicode

    字符串类型 str:Unicode字符串.采用''或者r''构造的字符串均为str,单引号可以用双引号或者三引号来代替.无论用哪种方式进行制定,在Python内部存储时没有区别. bytes:二进制字 ...

  9. css之自动换行

    自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大, 挺让人头疼,下面介绍的是CSS如何实现换行的方法 对于div,p等块级元素 正常文字的换行(亚洲文字和非亚洲文字)元素 ...

  10. 聊聊 Statsd 和 Collectd 那点事!

    StatsD 是由 Etsy 开发并发布的汇总和总结应用指标的一个简单的守护进程,近些年来发展迅速,已经变成了一个用于收集应用性能指标的统一的协议. 关于 Statsd 的使用已经有很多文章介绍过,所 ...