1. 简介

本次demo中一共封装了两个组件:ImageEditButton 和 ImageEditContainer。其中ImageEditContainer 是在 ImageEditButton,两个组件可单独使用。

在demo中,实现了 图片选择(拍照+本地),裁剪,压缩,保存本地 以及对已选择图片的删除操作(如果有修改需求,也可以使用对应方法进行操作,该方法已添加);

还有就是 针对 6.0权限的处理问题,本次使用了第三方库 rxpermissions 进行权限的处理。

2.项目主目录结构

3. 功能介绍

  1. MainActivity.java 界面效果图:

  1. ImageEditContainer 组件初始化:
  1. layImageContainer = (ImageEditContainer) findViewById(R.id.lay_image_container);
  2. layImageContainer.setEditListener(this);
  3. layImageContainer.setBtnImageResource(R.drawable.icon_picture_photograph);
  4. layImageContainer.setTotalImageQuantity(3);

如上代码,设置组件的监听,添加按钮展示图,以及最多选择图片个数。

  1. implements ImageEditContainer.ImageEditContainerListener 的实现
  1. @Override
  2. public void doAddImage() {
  3. PopupWindow mCameraPop = SelectPicturePopupWindowUtils.showSelectPicturePopupWindow(this);
  4. if (mCameraPop != null)
  5. mCameraPop.showAtLocation(layImageContainer, Gravity.BOTTOM, 0, 0);
  6. }
  7.  
  8. @Override
  9. public void doEditLocalImage(ImageItem imageItem) {
  10. if (imageItem != null) {
  11. layImageContainer.updateEditedImageItem(imageItem);
  12. }
  13. }
  14.  
  15. @Override
  16. public void doEditRemoteImage(RemoteImageItem remoteImageItem) {
  17. if (remoteImageItem != null) {
  18. if (remoteImageItem.isDeleted) {
  19. layImageContainer.removeRemoteImageItem(remoteImageItem);
  20. } else {
  21. layImageContainer.updateRemoteImageItem(remoteImageItem);
  22. }
  23. }
  24. }

  

当图片选择数量达到最大个数时,添加按钮会消失。效果图如下所示:

图片裁剪 效果图如下所示:

图片可拖拽,缩放


  1. 图片选择好后,进行图片压缩:
  1. private void compressImage(String path) {
  2.  
  3. if (TextUtils.isEmpty(path)) {
  4. return;
  5. }
  6. compressImage = compressImage + 1;
  7. ImageItem imageItem = new ImageItem();
  8. imageItem.storedPath = path;
  9.  
  10. File file = new File(FilePathUtils.getImageSavePath());
  11. if (!file.exists()) {
  12. file.mkdirs();
  13. }
  14. String filePath = FilePathUtils.getImageSavePath() + System.currentTimeMillis() + ".jpg";
  15. new Thread(new MyThread(imageItem, path, filePath)).start();
  16. List<String> imagePaths = new ArrayList<>();
  17. imagePaths.add(path);
  18. layImageContainer.addNewImageItem(imageItem);
  19. }

图片压缩比较慢,要开启个 线程进行压缩:

  1. public class MyThread implements Runnable {
  2. private String imgPath;
  3. private String outPath;
  4. private ImageItem imageItem;
  5.  
  6. public MyThread(ImageItem imageItem, String imgPath, String outPath) {
  7. this.imageItem = imageItem;
  8. this.imgPath = imgPath;
  9. this.outPath = outPath;
  10. }
  11.  
  12. public void run() {
  13. try {
  14. BitmapUtil.compressAndGenImage(imgPath, outPath, 500, false);
  15. compressImage = compressImage - 1;
  16. imageItem.storedPath = outPath;
  17. } catch (IOException e) {
  18. compressImage = compressImage - 1;
  19. e.printStackTrace();
  20. }
  21. }
  22. }

使用的压缩方法:

  1. /**
  2. * Compress by quality, and generate image to the path specified
  3. *
  4. * @param imgPath
  5. * @param outPath
  6. * @param maxSize target will be compressed to be smaller than this size.(kb)
  7. * @param needsDelete Whether delete original file after compress
  8. * @throws IOException
  9. */
  10. public static void compressAndGenImage(String imgPath, String outPath, int maxSize, boolean needsDelete) throws IOException {
  11. compressAndGenImage(getBitmap(imgPath), outPath, maxSize);
  12.  
  13. // Delete original file
  14. if (needsDelete) {
  15. File file = new File(imgPath);
  16. if (file.exists()) {
  17. file.delete();
  18. }
  19. }
  20. }

组件 ImageEditContainer 添加图片方法介绍:

可添加本地和网络图片

  1. /**
  2. * 添加本地图片
  3. * List<String> storePaths 本地图片路径数组
  4. */
  5. public void addNewImages(List<String> storePaths) {
  6.  
  7. }
  8.  
  9. /**
  10. * 添加本地图片
  11. */
  12. public void addNewImageItem(ImageItem imageItem) {
  13.  
  14. }
  15.  
  16. /**
  17. * 添加网络图片
  18. */
  19. public void addRemoteImageItem(RemoteImageItem remoteImageItem) {
  20.  
  21. }

组件 ImageEditContainer 其他方法介绍:

  1. /**
  2. * 设置组件中 选择按钮的宽高
  3. */
  4. public void setImvHeightAndWidth(int height, int width) {
  5.  
  6. }
  7.   /**
  8. * 设置图片最大数量
  9. */
  10. public void setTotalImageQuantity(int totalImageQuantity) {
  11.  
  12. }
  13. /**
  14. * 设置图片展示图
  15. */
  16. public void setBtnImageResource(int resid) {
  17.  
  18. }
  19.   /**
  20. * 获取组件中所有图片对象(本地+网络)
  21. */
  22. public List<Object> getAllImageItems() {
  23.  
  24. }
  25.  
  26.   public void updateEditedImageItem(ImageItem imageItem) {
  27.  
  28. }
  29.  
  30.   /**
  31. * 更新网络图片
  32. */
  33. public void updateRemoteImageItem(RemoteImageItem remoteImageItem) {
  34. }
  35.  
  36.   /**
  37. * 删除网络图片
  38. */
  39. public void removeRemoteImageItem(RemoteImageItem remoteImageItem) {
  40. }

4. 组件代码

1.ImageEditButton.java 

  1. /**
  2. * Created by dingzuoqiang on 2017/6/20.
  3. * Email: 530858106@qq.com
  4. */
  5. public class ImageEditButton extends RelativeLayout {
  6.  
  7. private final static String TAG = "ImageEditButton";
  8.  
  9. private ImageView imvAddImage;
  10. private ImageView imvEdit;
  11.  
  12. private int imvHeight;
  13. private int imvWidth;
  14. public ImageEditButtonListener editButtonListener;
  15.  
  16. public ImageEditButton(Context context) {
  17. this(context, null);
  18. }
  19.  
  20. public ImageEditButton(Context context, AttributeSet attrs) {
  21. super(context, attrs);
  22. LayoutInflater.from(context).inflate(R.layout.image_edit_button_view, this, true);
  23. imvHeight = CommonUtil.dip2px(getContext(), 70);
  24. imvWidth = imvHeight;
  25. imvAddImage = (ImageView) findViewById(R.id.imv_add_image);
  26. imvEdit = (ImageView) findViewById(R.id.imv_edit);
  27. setImvHeightAndWidth(imvHeight, imvWidth);
  28. imvAddImage.setOnClickListener(new OnClickListener() {
  29. @Override
  30. public void onClick(View v) {
  31. doEditImage();
  32. }
  33. });
  34. imvEdit.setOnClickListener(new OnClickListener() {
  35. @Override
  36. public void onClick(View v) {
  37. doEditImage2();
  38. }
  39. });
  40. }
  41.  
  42. public void setImvHeightAndWidth(int height, int width) {
  43. this.imvHeight = height;
  44. this.imvWidth = width;
  45. ViewGroup.LayoutParams layoutParams = imvAddImage.getLayoutParams();
  46. layoutParams.width = imvHeight;
  47. layoutParams.height = imvWidth;
  48. imvAddImage.setLayoutParams(layoutParams);
  49. }
  50.  
  51. public int getImvHeight() {
  52. return imvHeight;
  53. }
  54.  
  55. public int getImvWidth() {
  56. return imvWidth;
  57. }
  58.  
  59. public void setPadding2(int left, int top, int right, int bottom) {
  60. this.setPadding(left, top, right, bottom);
  61. }
  62.  
  63. public void setBtnImageResource(int resid) {
  64. imvAddImage.setImageResource(resid);
  65. // ImageLoaderUtils.loadImageFromDrawable(resid, imvAddImage, null);
  66. }
  67.  
  68. public void reset() {
  69. imvEdit.setVisibility(GONE);
  70. }
  71.  
  72. public void setEditButtonListener(ImageEditButtonListener editButtonListener) {
  73. this.editButtonListener = editButtonListener;
  74. }
  75.  
  76. public BaseImageItem getImageItem() {
  77. Object object = this.getTag();
  78. if (object instanceof BaseImageItem) return (BaseImageItem) object;
  79. return null;
  80. }
  81.  
  82. public void displayUI() {
  83. //
  84. Object object = this.getTag();
  85. if (object == null) return;
  86. if (object instanceof ImageItem) {
  87. ImageItem imageItem = (ImageItem) object;
  88.  
  89. if (TextUtils.isEmpty(imageItem.storedPath))
  90. return;
  91. File file = new File(imageItem.storedPath);
  92. if (file.exists()) {
  93. // 其实Glide加载本地图片和加载网络图片调用的方法是一样的,唯一的区别是说加载SD卡的图片需要SD卡的权限,加载网络需要网络权限
  94. Glide.with(getContext()).load(file).crossFade().into(imvAddImage);
  95. }
  96. } else if (object instanceof RemoteImageItem) {
  97. // 如果是 remoteImageItem 则需要从读取图片,同时不可以裁剪
  98. RemoteImageItem remoteImageItem = (RemoteImageItem) object;
  99. Glide.with(getContext()).load(remoteImageItem.thumbUrl).centerCrop().crossFade().into(imvAddImage);
  100. }
  101.  
  102. // TODO
  103. BaseImageItem baseImageItem = (BaseImageItem) object;
  104. displayNoteIcons(baseImageItem);
  105. }
  106.  
  107. private void displayNoteIcons(BaseImageItem baseImageItem) {
  108. imvEdit.setVisibility(VISIBLE);
  109. }
  110.  
  111. private void doEditImage() {
  112. if (editButtonListener == null) return;
  113.  
  114. Object object = this.getTag();
  115. if (object == null) {
  116. // add image
  117. editButtonListener.doAddImage();
  118. } else {
  119. //
  120. if (object instanceof ImageItem) {
  121. editButtonListener.doEditLocalImage((ImageItem) object);
  122. } else if (object instanceof RemoteImageItem) {
  123. editButtonListener.doEditRemoteImage((RemoteImageItem) object);
  124. }
  125. }
  126.  
  127. }
  128.  
  129. private void doEditImage2() {
  130. if (editButtonListener == null) return;
  131.  
  132. Object object = this.getTag();
  133. if (object != null) {
  134. //
  135. if (object instanceof ImageItem) {
  136. ImageItem imageItem = (ImageItem) object;
  137. imageItem.isDeleted = true;
  138. editButtonListener.doEditLocalImage(imageItem);
  139. } else if (object instanceof RemoteImageItem) {
  140. RemoteImageItem remoteImageItem = (RemoteImageItem) object;
  141. remoteImageItem.isDeleted = true;
  142. editButtonListener.doEditRemoteImage(remoteImageItem);
  143. }
  144. }
  145.  
  146. }
  147.  
  148. public interface ImageEditButtonListener {
  149.  
  150. public void doAddImage();
  151.  
  152. public void doEditLocalImage(ImageItem imageItem1);
  153.  
  154. public void doEditRemoteImage(RemoteImageItem remoteImageItem);
  155. }
  156.  
  157. }

2.ImageEditContainer.java 

  1. /**
  2. * Created by dingzuoqiang on 2017/6/20.
  3. * Email: 530858106@qq.com
  4. */
  5. public class ImageEditContainer extends HorizontalScrollView implements ImageEditButton.ImageEditButtonListener {
  6.  
  7. private final static String TAG = "ImageEditContainer";
  8. public ImageEditContainerListener mEditListener;
  9. private int idValue = 0;
  10. ImageEditButton imbAddImage;
  11. ViewGroup buttonsContainer;
  12.  
  13. private int totalImageQuantity = 3;// 总添加数量
  14. private int mBtnBgResid = 0;
  15.  
  16. public ImageEditContainer(Context context) {
  17. //super(context);
  18. this(context, null);
  19. }
  20.  
  21. public ImageEditContainer(Context context, AttributeSet attrs) {
  22. super(context, attrs);
  23. //
  24. LayoutInflater.from(context).inflate(R.layout.image_edit_container, this, true);
  25.  
  26. imbAddImage = (ImageEditButton) findViewById(R.id.imb_add_image);
  27. imbAddImage.setEditButtonListener(this);
  28. //
  29. buttonsContainer = (ViewGroup) findViewById(R.id.lay_container);
  30. setHorizontalScrollBarEnabled(false);
  31. setHorizontalFadingEdgeEnabled(false);
  32.  
  33. }
  34.  
  35. public void setImvHeightAndWidth(int height, int width) {
  36. for (int i = 0; i < buttonsContainer.getChildCount(); i++) {
  37. ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i);
  38. if (imageEditButton == null) continue;
  39. imageEditButton.setImvHeightAndWidth(height, width);
  40. }
  41. }
  42.  
  43. public void setTotalImageQuantity(int totalImageQuantity) {
  44. if (totalImageQuantity > 0)
  45. this.totalImageQuantity = totalImageQuantity;
  46. }
  47.  
  48. public void setBtnImageResource(int resid) {
  49. mBtnBgResid = resid;
  50. imbAddImage.setBtnImageResource(mBtnBgResid);
  51. }
  52.  
  53. public List<Object> getAllImageItems() {
  54. List<Object> allItems = new ArrayList<>();
  55. for (int i = 0; i < buttonsContainer.getChildCount(); i++) {
  56. ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i);
  57. if (imageEditButton == null) continue;
  58. if (imageEditButton.getTag() == null) continue;
  59. allItems.add(imageEditButton.getTag());
  60. }
  61. return allItems;
  62. }
  63.  
  64. /**
  65. * 添加本地图片
  66. */
  67. public void addNewImages(List<String> storePaths) {
  68.  
  69. for (int i = 0; i < storePaths.size(); i++) {
  70. String path = storePaths.get(i);
  71. ImageItem imageItem = new ImageItem();
  72. imageItem.storedPath = path;
  73. imageItem.id = idValue++;
  74. Log.i(TAG, "index=" + i + " id=" + imageItem.id);
  75. imageItem.index = (buttonsContainer.getChildCount() - 1);
  76. addBaseImageItemToContainer(imageItem);
  77.  
  78. }
  79. }
  80.  
  81. /**
  82. * 添加本地图片
  83. */
  84. public void addNewImageItem(ImageItem imageItem) {
  85. if (imageItem == null) return;
  86. imageItem.id = idValue++;
  87. imageItem.index = (buttonsContainer.getChildCount() - 1);
  88. addBaseImageItemToContainer(imageItem);
  89. }
  90.  
  91. public void updateEditedImageItem(ImageItem imageItem) {
  92. ImageEditButton imageEditButton = getImageEditButtonForImageItemById(imageItem);
  93. if (imageEditButton == null) {
  94. return;
  95. }
  96.  
  97. Object originObj = imageEditButton.getTag();
  98. if (!(originObj instanceof ImageItem)) {
  99. if (originObj instanceof RemoteImageItem) {
  100. RemoteImageItem remoteItem = (RemoteImageItem) originObj;
  101. if (remoteItem.index == imageItem.index) {
  102. imageEditButton.setTag(imageItem);
  103. imageEditButton.displayUI();
  104. return;
  105. }
  106. reorderForImageItem(imageItem);
  107. }
  108. return;
  109. }
  110.  
  111. ImageItem originImageItem = (ImageItem) originObj;
  112. if (imageItem.isDeleted) {
  113. removeButtonContainImageItem(imageItem);
  114. resetImageItemIndex();
  115. return;
  116. } else {
  117.  
  118. if (originImageItem.index == imageItem.index) {
  119. imageEditButton.setTag(imageItem);
  120. imageEditButton.displayUI();
  121. return;
  122. }
  123. reorderForImageItem(imageItem);
  124. }
  125. }
  126.  
  127. /**
  128. * 添加网络图片
  129. */
  130. public void addRemoteImageItem(RemoteImageItem remoteImageItem) {
  131. addBaseImageItemToContainer(remoteImageItem);
  132. }
  133.  
  134. /**
  135. * 更新网络图片
  136. */
  137. public void updateRemoteImageItem(RemoteImageItem remoteImageItem) {
  138.  
  139. ImageEditButton imageEditButton = getImageEditButtonForImageItemById(remoteImageItem);
  140. if (imageEditButton == null) {
  141. if (getAllImageItems().size() > 0) {
  142. List<Object> objectList = getAllImageItems();
  143. for (int i = 0; i < objectList.size(); i++) {
  144. BaseImageItem baseImageItem = (BaseImageItem) objectList.get(i);
  145. removeButtonContainImageItem(baseImageItem);
  146. }
  147. //
  148. objectList.add(0, remoteImageItem);
  149.  
  150. for (int i = 0; i < objectList.size(); i++) {
  151. addRemoteImageItem((RemoteImageItem) objectList.get(i));
  152. }
  153. //
  154. } else {
  155. addRemoteImageItem(remoteImageItem);
  156. }
  157.  
  158. return;
  159. }
  160. BaseImageItem baseImageItem = (BaseImageItem) imageEditButton.getTag();
  161. if (baseImageItem instanceof ImageItem) return;
  162. RemoteImageItem originRemoteItem = (RemoteImageItem) baseImageItem;
  163.  
  164. if (remoteImageItem.index == originRemoteItem.index) {
  165. // index 相同 只是update
  166. imageEditButton.setTag(remoteImageItem);
  167. imageEditButton.displayUI();
  168. return;
  169. }
  170. reorderForImageItem(remoteImageItem);
  171. }
  172.  
  173. /**
  174. * 删除网络图片
  175. */
  176. public void removeRemoteImageItem(RemoteImageItem remoteImageItem) {
  177.  
  178. ImageEditButton imageEditButton = getImageEditButtonForImageItemById(remoteImageItem);
  179. if (null != imageEditButton && null != imageEditButton.getTag()) {
  180. BaseImageItem baseImageItem = (BaseImageItem) imageEditButton.getTag();
  181. if (baseImageItem instanceof ImageItem) return;
  182. RemoteImageItem originRemoteItem = (RemoteImageItem) baseImageItem;
  183. removeButtonContainImageItem(remoteImageItem);
  184. resetImageItemIndex();
  185. }
  186. }
  187.  
  188. private void reorderForImageItem(BaseImageItem imageItem) {
  189. removeButtonContainImageItem(imageItem);
  190. List<BaseImageItem> imageItems = new ArrayList<>();
  191. imageItems.add(imageItem);
  192. int count = buttonsContainer.getChildCount();
  193. for (int i = imageItem.index; i < count; i++) {
  194. ImageEditButton button = (ImageEditButton) buttonsContainer.getChildAt(i);
  195. if (button == null) continue;
  196. BaseImageItem imageItem1 = (BaseImageItem) button.getTag();
  197. if (imageItem1 == null) continue;
  198. imageItems.add(imageItem1);
  199. }
  200. for (int i = 0; i < imageItems.size(); i++) {
  201. BaseImageItem item = imageItems.get(i);
  202. removeButtonContainImageItem(item);
  203. }
  204. //
  205. for (int i = 0; i < imageItems.size(); i++) {
  206. addBaseImageItemToContainer(imageItems.get(i));
  207. }
  208.  
  209. }
  210.  
  211. private void resetImageItemIndex() {
  212. for (int i = 0; i < buttonsContainer.getChildCount(); i++) {
  213.  
  214. try {
  215. ImageEditButton button = (ImageEditButton) buttonsContainer.getChildAt(i);
  216. if (button == null) continue;
  217. BaseImageItem imageItem = (BaseImageItem) button.getTag();
  218. if (imageItem == null) continue;
  219. imageItem.index = i;
  220.  
  221. } catch (Exception ignored) {
  222.  
  223. }
  224. }
  225. }
  226.  
  227. private ImageEditButton getImageEditButtonForImageItemById(BaseImageItem imageItem) {
  228. for (int i = 0; i < buttonsContainer.getChildCount(); i++) {
  229. ImageEditButton imageEditButton = (ImageEditButton) buttonsContainer.getChildAt(i);
  230. if (imageEditButton == null) continue;
  231. if (imageEditButton.getImageItem() == null) continue;
  232. BaseImageItem searchedImageItem = imageEditButton.getImageItem();
  233. if (imageItem.id.longValue() == searchedImageItem.id.longValue()) {
  234. return imageEditButton;
  235. }
  236. }
  237. return null;
  238. }
  239.  
  240. /*
  241. 删除一个 ImageItem
  242. */
  243. private void removeButtonContainImageItem(BaseImageItem imageItem) {
  244.  
  245. ImageEditButton imageEditButton = getImageEditButtonForImageItemById(imageItem);
  246. if (imageEditButton == null) return;
  247. buttonsContainer.removeView(imageEditButton);
  248. resetImageItemIndex();
  249. imbAddImage.setVisibility(buttonsContainer.getChildCount() <= totalImageQuantity ? VISIBLE : GONE);
  250. }
  251.  
  252. private void addBaseImageItemToContainer(BaseImageItem imageItem) {
  253. buttonsContainer.removeView(imbAddImage);
  254.  
  255. ImageEditButton imageEditButton = new ImageEditButton(getContext());
  256. if (mBtnBgResid != 0)
  257. imageEditButton.setBtnImageResource(mBtnBgResid);
  258. imageEditButton.setTag(imageItem);
  259. imageEditButton.setEditButtonListener(this);
  260. // buttonsContainer.addView(imageEditButton, buttonsContainer.getChildCount(), new RelativeLayout.LayoutParams(nSize, imbAddImage.getHeight()));
  261. buttonsContainer.addView(imageEditButton, buttonsContainer.getChildCount());
  262. LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) imageEditButton.getLayoutParams();
  263. layoutParams.rightMargin = CommonUtil.dip2px(getContext(), 5);
  264. imageEditButton.setLayoutParams(layoutParams);
  265. imageEditButton.setImvHeightAndWidth(imbAddImage.getImvHeight(), imbAddImage.getImvWidth());
  266. imageEditButton.displayUI();
  267. //
  268. buttonsContainer.addView(imbAddImage, buttonsContainer.getChildCount());
  269. //
  270. imbAddImage.setVisibility(buttonsContainer.getChildCount() <= totalImageQuantity ? VISIBLE : GONE);
  271.  
  272. resetImageItemIndex();
  273.  
  274. }
  275.  
  276. /*
  277. ImageEditButton listener
  278. */
  279.  
  280. public void doAddImage() {
  281. if (mEditListener != null) {
  282. mEditListener.doAddImage();
  283. }
  284. }
  285.  
  286. public void doEditLocalImage(ImageItem imageItem) {
  287. if (mEditListener != null) {
  288. mEditListener.doEditLocalImage(imageItem);
  289. }
  290.  
  291. }
  292.  
  293. public void doEditRemoteImage(RemoteImageItem remoteImageItem) {
  294. if (mEditListener != null) {
  295. mEditListener.doEditRemoteImage(remoteImageItem);
  296. }
  297.  
  298. }
  299. // -----
  300.  
  301. public void setEditListener(ImageEditContainerListener editListener) {
  302. this.mEditListener = editListener;
  303. }
  304.  
  305. //
  306.  
  307. public interface ImageEditContainerListener {
  308. public void doAddImage();
  309.  
  310. public void doEditLocalImage(ImageItem imageItem1);
  311.  
  312. public void doEditRemoteImage(RemoteImageItem remoteImageItem);
  313. }

项目源码下载:

图片选择器ImageEditContainer的更多相关文章

  1. Android之仿微信图片选择器

    先上效果图.第一张图显示的是“相机”文件夹中的所有图片:通过点击多张图片可以到第二张图所示的效果(被选择的图片会变暗,同时选择按钮变亮):点击最下面的那一栏可以到第三张图所示的效果(显示手机中所有包含 ...

  2. Android图片选择器

    1.概述 应公司项目需求,要做一个图片选择器,网上搜索了一些源码,我在别人的基础上进行了修改,另外页面也进行了重整,我的是先加载图片文件夹列表,然后再进入选择图片.            参考博客地址 ...

  3. paip.提升用户体验--radio图片选择器 easyui 实现..

    #paip.提升用户体验--radio图片选择器 easyui 实现.. =================================== ##原因... ------------------- ...

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

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

  5. 仿照微信的效果,实现了一个支持多选、选原图和视频的图片选择器,适配了iOS6-9系统,3行代码即可集成.

    提示:如果你发现了Bug,请尝试更新到最新版.目前最新版是1.6.4,此前的版本或多或少存在一些bug的~如果你已经是最新版了,请留一条评论,我看到了会尽快处理和修复哈~ 关于升级iOS10和Xcdo ...

  6. 一个iOS图片选择器的DEMO(实现图片添加,宫格排列,图片长按删除,以及图片替换等功能)

    在开发中,经常用到选择多张图片进行上传或作其他处理等等,以下DEMO满足了此功能中的大部分功能,可直接使用到项目中. 主要功能如下: 1,图片九宫格排列(可自动设置) 2,图片长按抖动(仿苹果软件删除 ...

  7. Android 高级UI设计笔记06:仿微信图片选择器(转载)

    仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache ...

  8. Android图片选择器--仿QQ

    当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了 ...

  9. Android 图片选择器

    图片选择器,遍历系统所有图片并显示,点击查看大图,长按选中,并将结果返回 字体颜色res/color建立text_selecor.xml <selector xmlns:android=&quo ...

随机推荐

  1. Android GIS开发系列-- 入门季(10) MapView快速定位到Geometry

    我们知道某个Geometry的坐标,但不知道具体的位置,该如何使地图快速定位呢?这时需要用到MapView.setExtent方法,来看下这个方法的介绍:Zooms the map to the gi ...

  2. CSDN 夏令营程序 试题分析 (2)

    题目:若须要在O(nlogn)(以2为底)的时间内完毕对数组的排序.且要求排序是稳定的,则可选择的排序方法是: A.高速排序       B.堆排序            C.归并排序  D.直接插入 ...

  3. BSON结构

    BSON结构 flyfish 2015-7-24 主要解释bsonspec.org站点上的两个样例 {"hello": "world"}  hello为key. ...

  4. 使用RoboCopy 命令[转载]

    经常进行文件管理操作的朋友们,不满意于Windows系统内置的复制功能,因为它太龟速了.于是大家就使用FastCopy.TeraCopy之类的软件来加速复制,但是你是否知道Windows 7已经内置快 ...

  5. Maven项目中遇到的奇葩问题(续)

    场景描写叙述 开发项目搞环境是一个很蛋疼的问题.总是会遇到各种奇葩的问题,上一篇文章http://blog.csdn.net/gao36951/article/details/50955526中遇到的 ...

  6. Zabbix ---proxy 代理

    Zabbix zabbix 官网 : https://www.zabbix.com/ 环境准备: 三台服务器: server 端: 192.168.206.6 proxy 端 :  192.168.2 ...

  7. Linux Shell參数扩展(Parameter Expansion)

    本文主要參考:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02 其它资料:ht ...

  8. cocos2dx 2.2.3编译第一个apk到安卓手机

    1.android-ndk-r10(注意32位和64位的别下错了 我不小心下错了 折腾了我两天) 2.adt_201407(eclipse已经跟sdk等等集成在一起了)   3.Cococs2d-x ...

  9. Android之应用程序怎样调用支付宝接口

    http://blog.csdn.net/lilidejing/article/details/19483717 近期在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口.由于用的人比 ...

  10. Android源代码文件夹结构说明

    在学习Android的过程中,学习写应用还好.一開始不用管太多代码.直接调用函数就能够了,可是工作中却须要改动到framework之类的东东 所以感觉開始纠结了,又是初学,非常多不懂,所以就去找了关于 ...