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

微信

微信

微信

微信

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

//部分代码如下

  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. validate中remote的用法

    jquery中的插件validate主要可以用于表单验证,极大地方便了我们,而validate中的remote方法更是非常的方便.以下介绍它的两个主要用途 1.注册时用于验证用户名是否存在 >& ...

  2. WPF MVVM 中怎样在ViewModel总打开的对话框在窗体之前

    今天在WPF的项目中,写打印插件,在ViewModel中对需要弹出打印对话框,而对话框如果没有Owner所属的时候经常会被当前应用程序遮住,导致我都不知道到底弹出来没有! 参照:http://www. ...

  3. puppet中anchor的作用

    anchor出现背景:Puppet Forge是一个网上的module仓库,许多人写的puppet module会传上去,供大家下载使用.大家下载了一个module可以直接使用,不应该再来改动里面ma ...

  4. BeeFramework

    A semi-hybrid framework that allows you to create mobile apps using Objective-C and XML/CSS

  5. how to run demo city bars using sencha architect

    1. create a project using city bars template in sencha architect 2. save your project name as CityBa ...

  6. 解决npm安装模块时 npm err! registry error parsing json

    最近还真是点背,从yeoman生成一个react项目或是github上克隆一个项目,在npm install的时候, 一直报npm err! registry error parsing json(就 ...

  7. pywinauto简单介绍

    Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件. 其中,最主要功能为对 ...

  8. Memcache仅仅支持简单数据类型

    Memcache仅仅支持简单数据类型 ,复杂数据类型需要应用自己处理 从数据库当中取出数据[User [id=1, username=guowuxin, password=guowuxin], Use ...

  9. noj [1479] How many (01背包||DP||DFS)

    http://ac.nbutoj.com/Problem/view.xhtml?id=1479 [1479] How many 时间限制: 1000 ms 内存限制: 65535 K 问题描述 The ...

  10. mapreduce 多路输出

    Streaming支持多路输出(SuffixMultipleTextOutputFormat) 如下示例: hadoop streaming \ -input /home/mr/data/test_t ...