开源系列1---造个图片选择器

打算开个开源系列,用来分享在项目过程中些的一些小轮子。
在这年的末尾,挤下时间,看能改几个还勉强过得去的出来分享给大家。
能力有些,实现得也不算很优雅。
还望各大神指点。

我要造轮子

作为一名爱折腾人员,重复造轮子这种事还是常做的。
没办法啊,做的过程才能发现问题嘛!最少我在做的过程就遇到啦!
例如阴影效果,图片如何压缩显示的问题(蹩脚的写了一个ImageLoader实在不怎样,改用Fresco!),排列等等问题

项目的下载地址请点击这里

我们直接上效果图,这个是完成后的样子,目前改得勉强像一回事了。
就先粘贴上来,有需要的就拿去再根据自己需要改一个。

这里写图片描述这里写图片描述

这里写图片描述

后记

在做这个轮子的过程还是遇到一些小问题,所以这里列一下

  • 路径Bug
    在开发过程过程,遇到一些bug,到现在还是很困惑,但时间限制,没去深究。
    例如有时候,我们的ContentResolver 返回的路径中,有时小写,有时大写。
    例如下面

    /storage/emulated/0/Tencent/MicroMsg/WeiXin/1450409463723.jpg        
    /storage/emulated/0/tencent/MicroMsg/WeiXin/1450409423269.jpg
    /storage/emulated/0/Tencent/MicroMsg/Download/da_1446188743286.jpg
    /storage/emulated/0/tencent/MicroMsg/WeiXin/mmexport1446289719320.jpg
    /storage/emulated/0/tencent/MicroMsg/WeiXin/microMsg.1445260200558.jpg
    

    返回的路径里面的tencent这个单词有时是大写,有时是小写,导致做判断时候出错!
    真的很让人绝望!!找了好久才调试出是这出了问题 !!有那个大神懂得看到了反馈下!
    所以最后只能靠这句来搞定path.equalsIgnoreCase(imageBean.path),忽略大小写。

  • 扫描图片
    要扫描整个手机图片, 如果用户突然把手机某个目录的图片删除了,在打开我们的程序,则会程序返回的数据还是历史数据,点击那个目录其实是空空如也,系统一般需要用户去重开机,更新缓存。

  • 阴影效果
    目前用了一个很蠢的办法来解决,就是在我们的弹出来的目录和背后的图片间夹一个view来做阴影,然后配合一个alpha动画。
    状态:不怎么优雅的解决了!

  • 目录的弹出效果
    这个功能没有优化,看到微信的那个弹出来的文件夹列表的效果挺好的,这个下次有空再继续做
    另外这个框的大小的调整写得还是挺丑的,
    监听getViewTreeObserver().addOnGlobalLayoutListener()的方式来改变大小。

  • 预览图片的界面优化
    有个小问题就是预览图片就只能看,不支持多指触控进行方法,缩小,旋转等操作,以前的项目有写过一个类似插件,下次再把它加上。
    状态:解决!

  • 提示时间效果
    在滚动的过程中,需要在顶部哪里加多个时间的提示,出现和结束加多个动画,看起来好看些

  • 拍照问题
    真的遇到过第三方room把系统自带的相机给阉割了的,然后搞了一个不知道什么鬼的来替代,导致跳去拍照过程失败,下次有空把自己以前写的也继承到里面去。

三个参考案例

1. MultiImageSelector

看起来效果还是挺好的:
这里写图片描述 这里写图片描述

2. 鸿洋的超高仿微信图片选择器 图片该这么加载

这里写图片描述

3.Android-Ultra-Photo-Selector

地址:https://github.com/AizazAZ/Android-Ultra-Photo-Selector

这里写图片描述

##关于这些案例的一些观点:

  1. 缩略图
    现在看到的这几个不是使用系统生成的缩略图来显示的,而是找到原图,然后压缩显示,这种策略不是很优雅,因为要实时的弄,关于缩略图的部分,欢迎看下官方的介绍,这有时候也是无奈之举吧。因为曾经遇到过有一些第三方room会把系统图库给砍掉,用别的来替代。所以为了做适配和兼容,只能自己来搞了。
  2. 弹出来的目录框
    在点击左下角的目录选项的时候,弹出来的目录框没有考虑到如果文件夹少的时候,底部是没填充满的。
    这里写图片描述

  3. 阴影效果
    弹出来的目录的背后是要加个阴影效果的,但目前看到的都是直接整个界面给抹黑,不是很好看。
    基本使用的方法就像下面这样,这个效果不是很好看。

     WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = 0.7f;
    getWindow().setAttributes(lp);
    

    微信的版本是这样的,他是背后的一层,在Actionbar下面,且是跟随着弹出来的框逐渐加深的。
    这里写图片描述

热评文章