[转载]Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果 – Mobile Internet developer – 博客频道 – CSDN.NET.
转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18730223),请尊重他人的辛勤劳动成果,谢谢!
写 这篇文章之前,先简单说几句,首先是先恭喜下自己获得了2013年的博客之星称号,很意外也很开心,自己是从2013年开始写博客,那时候也不知道怎么 写,我从小就不喜欢写日记,作文什么的,所以刚开始都是贴代码,也没有人看,后面慢慢的,写的文章被推荐博客首页和CSDN首页(这里也要小小的感谢下小 编MM),访问量逐渐的多了起来,有更多的人看我的文章,这也使自己有了继续写文章的动力,也希望我写的东西对大家有点帮助吧,在2014年我会继续在 CSDN上面写博客,然后是感谢博客之星给我投票支持我的朋友们,谢谢你们支持我的每一票,最后就是2014春节马上就到了,提前祝福大家新年快乐,工作 顺利,事事顺心!
回到主题,之前群里面有朋友问我,有没有关于本地图片选择的Demo,类似微信的效果,他说网上没有这方面的Demo,问 我能不能写一篇关于这个效果的Demo,于是我研究了下微信的本地图片选择的Demo,自己仿照的写了下分享给大家,希望对以后有这样子需求的朋友有一点 帮助吧,主要使用的是ContentProvider扫描手机中的图片,并用GridView将图片显示出来,关于GridView和ListView显 示图片的问题,一直是一个很头疼的问题,因为我们手机的内存有限,手机给每个应用程序分配的内存也有限,所以图片多的情况下很容易伴随着OOM的发生,不 过现在也有很多的开源的图片显示框架,大家有兴趣的可以去了解了解,今天我的这篇文章使用的是LruCache这个类(之前写了一篇使用LruCache 加载网络图片的Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅)以及对图片进行相对应的裁剪,这样也可以尽量的避免OOM的发生,我们先看下微信的效果吧
接下来我们就来实现这些效果吧,首先我们新建一个项目,取名ImageScan
首 先我们先看第一个界面吧,使用将手机中的图片扫描出来,然后根据图片的所在的文件夹将其分类出来,并显示所在文件夹里面的一张图片和文件夹中图片个数,我 们根据界面元素(文件夹名, 文件夹图片个数,文件夹中的一张图片)使用一个实体对象ImageBean来封装这三个属性
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /** * GridView的每个item的数据对象 * * @author len * */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ImageBean</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > /** * 文件夹的第一张图片路径 */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > topImagePath</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /** * 文件夹名 */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > folderName</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /** * 文件夹中的图片数 */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > imageCounts</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > getTopImagePath</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > topImagePath</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setTopImagePath</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > topImagePath</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >topImagePath </span><span class = "pun" >=</span><span class = "pln" > topImagePath</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > getFolderName</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > folderName</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setFolderName</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > folderName</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >folderName </span><span class = "pun" >=</span><span class = "pln" > folderName</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > getImageCounts</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > imageCounts</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setImageCounts</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > imageCounts</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >imageCounts </span><span class = "pun" >=</span><span class = "pln" > imageCounts</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
接下来就是主界面的布局啦,上面的导航栏我没有加进去,只有下面的GridView,所以说主界面布局中只有一个GridView
接下来就是GridView的Item的布局,看上面的图也行你会认为他的效果是2张图片添加的效果,其实不是,后面的叠加效果只是一张背景图片而已,代码先贴上来
< span class = "com" > <!--?xml version="1.0" encoding="UTF-8"?--> </ span >< span class = "pln" > </ span > |
看到上面的布局代码,也行你已经发现了,上面使用的是自定义的MyImageView,我先不说这个自定义MyImageView的作用,待会再给大家说,我们继续看代码
第一个界面的主要代码
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >io</span><span class = "pun" >.</span><span class = "typ" >File</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >ArrayList</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >HashMap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >Iterator</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >List</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >Map</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >app</span><span class = "pun" >.</span><span class = "typ" >Activity</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >app</span><span class = "pun" >.</span><span class = "typ" >ProgressDialog</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >content</span><span class = "pun" >.</span><span class = "typ" >ContentResolver</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >content</span><span class = "pun" >.</span><span class = "typ" >Intent</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >database</span><span class = "pun" >.</span><span class = "typ" >Cursor</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >net</span><span class = "pun" >.</span><span class = "typ" >Uri</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Bundle</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Handler</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Message</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >provider</span><span class = "pun" >.</span><span class = "typ" >MediaStore</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >View</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >AdapterView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >AdapterView</span><span class = "pun" >.</span><span class = "typ" >OnItemClickListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >GridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /** * @blog http://blog.csdn.net/xiaanming * * @author xiaanming * * */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >MainActivity</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >Activity</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >HashMap</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > mGruopMap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >HashMap</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;();</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > SCAN_OK </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" > 1 </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ProgressDialog</span><span class = "pln" > mProgressDialog</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >GroupAdapter</span><span class = "pln" > adapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGroupGridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Handler</span><span class = "pln" > mHandler </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Handler</span><span class = "pun" >(){</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > handleMessage</span><span class = "pun" >(</span><span class = "typ" >Message</span><span class = "pln" > msg</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >handleMessage</span><span class = "pun" >(</span><span class = "pln" >msg</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > switch </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >msg</span><span class = "pun" >.</span><span class = "pln" >what</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > case </span><span class = "pln" > SCAN_OK</span><span class = "pun" >:</span><span class = "pln" > </span><span class = "com" > //关闭进度条</span><span class="pln"> mProgressDialog</span><span class = "pun" >.</span><span class = "pln" >dismiss</span><span class = "pun" >();</span><span class = "pln" > adapter </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >GroupAdapter</span><span class = "pun" >(</span><span class = "typ" >MainActivity</span><span class = "pun" >.</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > list </span><span class = "pun" >=</span><span class = "pln" > subGroupOfImage</span><span class = "pun" >(</span><span class = "pln" >mGruopMap</span><span class = "pun" >),</span><span class = "pln" > mGroupGridView</span><span class = "pun" >);</span><span class = "pln" > mGroupGridView</span><span class = "pun" >.</span><span class = "pln" >setAdapter</span><span class = "pun" >(</span><span class = "pln" >adapter</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > break </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >};</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onCreate</span><span class = "pun" >(</span><span class = "typ" >Bundle</span><span class = "pln" > savedInstanceState</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onCreate</span><span class = "pun" >(</span><span class = "pln" >savedInstanceState</span><span class = "pun" >);</span><span class = "pln" > setContentView</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >layout</span><span class = "pun" >.</span><span class = "pln" >activity_main</span><span class = "pun" >);</span><span class = "pln" > mGroupGridView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >GridView</span><span class = "pun" >)</span><span class = "pln" > findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >main_grid</span><span class = "pun" >);</span><span class = "pln" > getImages</span><span class = "pun" >();</span><span class = "pln" > mGroupGridView</span><span class = "pun" >.</span><span class = "pln" >setOnItemClickListener</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >OnItemClickListener</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onItemClick</span><span class = "pun" >(</span><span class = "typ" >AdapterView</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;?&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > parent</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > view</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > long </span><span class = "pln" > id</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > childList </span><span class = "pun" >=</span><span class = "pln" > mGruopMap</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >list</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >).</span><span class = "pln" >getFolderName</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pln" > mIntent </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Intent</span><span class = "pun" >(</span><span class = "typ" >MainActivity</span><span class = "pun" >.</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ShowImageActivity</span><span class = "pun" >.</span><span class = "kwd" > class </span><span class = "pun" >);</span><span class = "pln" > mIntent</span><span class = "pun" >.</span><span class = "pln" >putStringArrayListExtra</span><span class = "pun" >(</span><span class = "str" > "data" </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ArrayList</span><span class = "pun" >)</span><span class = "pln" >childList</span><span class = "pun" >);</span><span class = "pln" > startActivity</span><span class = "pun" >(</span><span class = "pln" >mIntent</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > getImages</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //显示进度条</span><span class="pln"> mProgressDialog </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >ProgressDialog</span><span class = "pun" >.</span><span class = "pln" >show</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "str" > "正在加载..." </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Thread</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Runnable</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > run</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Uri</span><span class = "pln" > mImageUri </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >EXTERNAL_CONTENT_URI</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >ContentResolver</span><span class = "pln" > mContentResolver </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >MainActivity</span><span class = "pun" >.</span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >getContentResolver</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //只查询jpeg和png的图片</span><span class="pln"> </span><span class = "typ" >Cursor</span><span class = "pln" > mCursor </span><span class = "pun" >=</span><span class = "pln" > mContentResolver</span><span class = "pun" >.</span><span class = "pln" >query</span><span class = "pun" >(</span><span class = "pln" >mImageUri</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >MIME_TYPE </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "str" > "=? or " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >MIME_TYPE </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "str" > "=?" </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pun" >[]</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "str" > "image/jpeg" </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "str" > "image/png" </span><span class = "pln" > </span><span class = "pun" >},</span><span class = "pln" > </span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >DATE_MODIFIED</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >mCursor </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > while </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >mCursor</span><span class = "pun" >.</span><span class = "pln" >moveToNext</span><span class = "pun" >())</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //获取图片的路径</span><span class="pln"> </span><span class = "typ" >String</span><span class = "pln" > path </span><span class = "pun" >=</span><span class = "pln" > mCursor</span><span class = "pun" >.</span><span class = "pln" >getString</span><span class = "pun" >(</span><span class = "pln" >mCursor </span><span class = "pun" >.</span><span class = "pln" >getColumnIndex</span><span class = "pun" >(</span><span class = "typ" >MediaStore</span><span class = "pun" >.</span><span class = "typ" >Images</span><span class = "pun" >.</span><span class = "typ" >Media</span><span class = "pun" >.</span><span class = "pln" >DATA</span><span class = "pun" >));</span><span class = "pln" > </span><span class = "com" > //获取该图片的父路径名</span><span class="pln"> </span><span class = "typ" >String</span><span class = "pln" > parentName </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >File</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >).</span><span class = "pln" >getParentFile</span><span class = "pun" >().</span><span class = "pln" >getName</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //根据父路径名将图片放入到mGruopMap中</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(!</span><span class = "pln" >mGruopMap</span><span class = "pun" >.</span><span class = "pln" >containsKey</span><span class = "pun" >(</span><span class = "pln" >parentName</span><span class = "pun" >))</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > chileList </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > chileList</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > mGruopMap</span><span class = "pun" >.</span><span class = "pln" >put</span><span class = "pun" >(</span><span class = "pln" >parentName</span><span class = "pun" >,</span><span class = "pln" > chileList</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > else </span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > mGruopMap</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >parentName</span><span class = "pun" >).</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > //通知Handler扫描图片完成</span><span class="pln"> mHandler</span><span class = "pun" >.</span><span class = "pln" >sendEmptyMessage</span><span class = "pun" >(</span><span class = "pln" >SCAN_OK</span><span class = "pun" >);</span><span class = "pln" > mCursor</span><span class = "pun" >.</span><span class = "pln" >close</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}).</span><span class = "pln" >start</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 组装分组界面GridView的数据源,因为我们扫描手机的时候将图片信息放在HashMap中 * 所以需要遍历HashMap将数据组装成List * * @param mGruopMap * @return */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > subGroupOfImage</span><span class = "pun" >(</span><span class = "typ" >HashMap</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > mGruopMap</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >mGruopMap</span><span class = "pun" >.</span><span class = "pln" >size</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >Iterator</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Map</span><span class = "pun" >.</span><span class = "typ" >Entry</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > it </span><span class = "pun" >=</span><span class = "pln" > mGruopMap</span><span class = "pun" >.</span><span class = "pln" >entrySet</span><span class = "pun" >().</span><span class = "pln" >iterator</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > while </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >it</span><span class = "pun" >.</span><span class = "pln" >hasNext</span><span class = "pun" >())</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Map</span><span class = "pun" >.</span><span class = "typ" >Entry</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > entry </span><span class = "pun" >=</span><span class = "pln" > it</span><span class = "pun" >.</span><span class = "kwd" >next</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >ImageBean</span><span class = "pln" > mImageBean </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ImageBean</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > key </span><span class = "pun" >=</span><span class = "pln" > entry</span><span class = "pun" >.</span><span class = "pln" >getKey</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > value </span><span class = "pun" >=</span><span class = "pln" > entry</span><span class = "pun" >.</span><span class = "pln" >getValue</span><span class = "pun" >();</span><span class = "pln" > mImageBean</span><span class = "pun" >.</span><span class = "pln" >setFolderName</span><span class = "pun" >(</span><span class = "pln" >key</span><span class = "pun" >);</span><span class = "pln" > mImageBean</span><span class = "pun" >.</span><span class = "pln" >setImageCounts</span><span class = "pun" >(</span><span class = "pln" >value</span><span class = "pun" >.</span><span class = "pln" >size</span><span class = "pun" >());</span><span class = "pln" > mImageBean</span><span class = "pun" >.</span><span class = "pln" >setTopImagePath</span><span class = "pun" >(</span><span class = "pln" >value</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "lit" > 0 </span><span class = "pun" >));</span><span class = "com" > //获取该组的第一张图片</span><span class="pln"> list</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >mImageBean</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
首先看getImages()这个方法,该方法是使用ContentProvider将手机中的图片扫描出来,我这里只扫描了手机的外部存储中的图片,由于手机中可能存在很多的图片,扫描图片又比较耗时,所以我们在这里开启了子线程去获取图片,扫描的图片都存放在Cursor中,我们先要将图片按照文件夹进行分类,我们使用了HashMap来进行分类并将结果存储到mGruopMap(Key是文件夹名,Value是文件夹中的图片路径的List)中,分类完了关闭Cursor并利用Handler来通知主线程
然后是subGroupOfImage()方法,改方法是将mGruopMap的数据组装到List中,在List中存放GridView中的每个item的数据对象ImageBean, 遍历HashMap对象,具体的逻辑看代码,之后就是给GridView设置Adapter。
设置item点击事件,点击文件夹跳转到展示文件夹图片的Activity, 我们需要传递每个文件夹中的图片的路径的集合
看GroupAdapter的代码之前,我们先看一个比较重要的类,本地图片加载器NativeImageLoader
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "pln" >concurrent</span><span class = "pun" >.</span><span class = "typ" >ExecutorService</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "pln" >concurrent</span><span class = "pun" >.</span><span class = "typ" >Executors</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Bitmap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >BitmapFactory</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Point</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Handler</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Message</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >support</span><span class = "pun" >.</span><span class = "pln" >v4</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >LruCache</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > /** * 本地图片加载器,采用的是异步解析本地图片,单例模式利用getInstance()获取NativeImageLoader实例 * 调用loadNativeImage()方法加载本地图片,此类可作为一个加载本地图片的工具类 * * @blog http://blog.csdn.net/xiaanming * * @author xiaanming * */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >LruCache</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > mMemoryCache</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pln" > mInstance </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ExecutorService</span><span class = "pln" > mImageThreadPool </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >Executors</span><span class = "pun" >.</span><span class = "pln" >newFixedThreadPool</span><span class = "pun" >(</span><span class = "lit" > 1 </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pun" >(){</span><span class = "pln" > </span><span class = "com" > //获取应用程序的最大内存</span><span class="pln"> </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > maxMemory </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >Runtime</span><span class = "pun" >.</span><span class = "pln" >getRuntime</span><span class = "pun" >().</span><span class = "pln" >maxMemory</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "lit" > 1024 </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //用最大内存的1/4来存储图片</span><span class="pln"> </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > cacheSize </span><span class = "pun" >=</span><span class = "pln" > maxMemory </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "lit" > 4 </span><span class = "pun" >;</span><span class = "pln" > mMemoryCache </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >LruCache</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >String</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;(</span><span class = "pln" >cacheSize</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //获取每张图片的大小</span><span class="pln"> </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > sizeOf</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > key</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > bitmap</span><span class = "pun" >.</span><span class = "pln" >getRowBytes</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >*</span><span class = "pln" > bitmap</span><span class = "pun" >.</span><span class = "pln" >getHeight</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "lit" > 1024 </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >};</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 通过此方法来获取NativeImageLoader的实例 * @return */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pln" > getInstance</span><span class = "pun" >(){</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > mInstance</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 加载本地图片,对图片不进行裁剪 * @param path * @param mCallBack * @return */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > loadNativeImage</span><span class = "pun" >(</span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >NativeImageCallBack</span><span class = "pln" > mCallBack</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >loadNativeImage</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >,</span><span class = "pln" > mCallBack</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 此方法来加载本地图片,这里的mPoint是用来封装ImageView的宽和高,我们会根据ImageView控件的大小来裁剪Bitmap * 如果你不想裁剪图片,调用loadNativeImage(final String path, final NativeImageCallBack mCallBack)来加载 * @param path * @param mPoint * @param mCallBack * @return */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > loadNativeImage</span><span class = "pun" >(</span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >Point</span><span class = "pln" > mPoint</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >NativeImageCallBack</span><span class = "pln" > mCallBack</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "com" > //先获取内存中的Bitmap</span><span class="pln"> </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap </span><span class = "pun" >=</span><span class = "pln" > getBitmapFromMemCache</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >Handler</span><span class = "pln" > mHander </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Handler</span><span class = "pun" >(){</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > handleMessage</span><span class = "pun" >(</span><span class = "typ" >Message</span><span class = "pln" > msg</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >handleMessage</span><span class = "pun" >(</span><span class = "pln" >msg</span><span class = "pun" >);</span><span class = "pln" > mCallBack</span><span class = "pun" >.</span><span class = "pln" >onImageLoader</span><span class = "pun" >((</span><span class = "typ" >Bitmap</span><span class = "pun" >)</span><span class = "pln" >msg</span><span class = "pun" >.</span><span class = "pln" >obj</span><span class = "pun" >,</span><span class = "pln" > path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >};</span><span class = "pln" > </span><span class = "com" > //若该Bitmap不在内存缓存中,则启用线程去加载本地的图片,并将Bitmap加入到mMemoryCache中</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmap </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > mImageThreadPool</span><span class = "pun" >.</span><span class = "pln" >execute</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Runnable</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > run</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //先获取图片的缩略图</span><span class="pln"> </span><span class = "typ" >Bitmap</span><span class = "pln" > mBitmap </span><span class = "pun" >=</span><span class = "pln" > decodeThumbBitmapForFile</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > mPoint </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >?</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >:</span><span class = "pln" > mPoint</span><span class = "pun" >.</span><span class = "pln" >x</span><span class = "pun" >,</span><span class = "pln" > mPoint </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >?</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >:</span><span class = "pln" > mPoint</span><span class = "pun" >.</span><span class = "pln" >y</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >Message</span><span class = "pln" > msg </span><span class = "pun" >=</span><span class = "pln" > mHander</span><span class = "pun" >.</span><span class = "pln" >obtainMessage</span><span class = "pun" >();</span><span class = "pln" > msg</span><span class = "pun" >.</span><span class = "pln" >obj </span><span class = "pun" >=</span><span class = "pln" > mBitmap</span><span class = "pun" >;</span><span class = "pln" > mHander</span><span class = "pun" >.</span><span class = "pln" >sendMessage</span><span class = "pun" >(</span><span class = "pln" >msg</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //将图片加入到内存缓存</span><span class="pln"> addBitmapToMemoryCache</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > mBitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > bitmap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 往内存缓存中添加Bitmap * * @param key * @param bitmap */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > addBitmapToMemoryCache</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > key</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pln" > </span><span class = "pun" >(</span><span class = "pln" >getBitmapFromMemCache</span><span class = "pun" >(</span><span class = "pln" >key</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >&</span><span class = "pln" >amp</span><span class = "pun" >;&</span><span class = "pln" >amp</span><span class = "pun" >;</span><span class = "pln" > bitmap </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > mMemoryCache</span><span class = "pun" >.</span><span class = "pln" >put</span><span class = "pun" >(</span><span class = "pln" >key</span><span class = "pun" >,</span><span class = "pln" > bitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 根据key来获取内存中的图片 * @param key * @return */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > getBitmapFromMemCache</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > key</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > mMemoryCache</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >key</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 根据View(主要是ImageView)的宽和高来获取图片的缩略图 * @param path * @param viewWidth * @param viewHeight * @return */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Bitmap</span><span class = "pln" > decodeThumbBitmapForFile</span><span class = "pun" >(</span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > viewWidth</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > viewHeight</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "typ" >Options</span><span class = "pln" > options </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "typ" >Options</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "com" > //设置为true,表示解析Bitmap对象,该对象不占内存</span><span class="pln"> options</span><span class = "pun" >.</span><span class = "pln" >inJustDecodeBounds </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > true </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "pln" >decodeFile</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > options</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //设置缩放比例</span><span class="pln"> options</span><span class = "pun" >.</span><span class = "pln" >inSampleSize </span><span class = "pun" >=</span><span class = "pln" > computeScale</span><span class = "pun" >(</span><span class = "pln" >options</span><span class = "pun" >,</span><span class = "pln" > viewWidth</span><span class = "pun" >,</span><span class = "pln" > viewHeight</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //设置为false,解析Bitmap对象加入到内存中</span><span class="pln"> options</span><span class = "pun" >.</span><span class = "pln" >inJustDecodeBounds </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > false </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > </span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "pln" >decodeFile</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > options</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 根据View(主要是ImageView)的宽和高来计算Bitmap缩放比例。默认不缩放 * @param options * @param width * @param height */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > computeScale</span><span class = "pun" >(</span><span class = "typ" >BitmapFactory</span><span class = "pun" >.</span><span class = "typ" >Options</span><span class = "pln" > options</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > viewWidth</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > viewHeight</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > inSampleSize </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "lit" > 1 </span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >viewWidth </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pln" > </span><span class = "pun" >||</span><span class = "pln" > viewWidth </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > inSampleSize</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > bitmapWidth </span><span class = "pun" >=</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >outWidth</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > bitmapHeight </span><span class = "pun" >=</span><span class = "pln" > options</span><span class = "pun" >.</span><span class = "pln" >outHeight</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "com" > //假如Bitmap的宽度或高度大于我们设定图片的View的宽高,则计算缩放比例</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmapWidth </span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > viewWidth </span><span class = "pun" >||</span><span class = "pln" > bitmapHeight </span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > viewWidth</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > widthScale </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >Math</span><span class = "pun" >.</span><span class = "pln" >round</span><span class = "pun" >((</span><span class = "kwd" > float </span><span class = "pun" >)</span><span class = "pln" > bitmapWidth </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > float </span><span class = "pun" >)</span><span class = "pln" > viewWidth</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > heightScale </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >Math</span><span class = "pun" >.</span><span class = "pln" >round</span><span class = "pun" >((</span><span class = "kwd" > float </span><span class = "pun" >)</span><span class = "pln" > bitmapHeight </span><span class = "pun" >/</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "kwd" > float </span><span class = "pun" >)</span><span class = "pln" > viewWidth</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //为了保证图片不缩放变形,我们取宽高比例最小的那个</span><span class="pln"> inSampleSize </span><span class = "pun" >=</span><span class = "pln" > widthScale </span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "pln" > heightScale </span><span class = "pun" >?</span><span class = "pln" > widthScale </span><span class = "pun" >:</span><span class = "pln" > heightScale</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > inSampleSize</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 加载本地图片的回调接口 * * @author xiaanming * */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > interface </span><span class = "pln" > </span><span class = "typ" >NativeImageCallBack</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > /** * 当子线程加载完了本地的图片,将Bitmap和图片路径回调在此方法中 * @param bitmap * @param path */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onImageLoader</span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
- 该类是一个单例类,提供了本地图片加载,内存缓存,裁剪等逻辑,该类在加载本地图片的时候采用的是异步加载的方式,对于大图片的加载也是 比较耗时的,所以采用子线程的方式去加载,对于图片的缓存机制使用的是LruCache,使用手机分配给应用程序内存的1/4用来缓存图片,除了使用 LruCache缓存图片之外,还对图片进行了裁剪,举个很简单的例子,假如我们的控件大小是100 * 100, 而我们的图片是400*400,我们加载这么大的图片需要很多的内存,所以我们采用了图片裁剪,根据控件的大小来确定图片的裁剪比例,从而减小内存的消 耗,提过GridView滑动的流畅度,介绍里面几个比较重要的方法,computeScale()计算图片需要裁剪的比例,根据控件的大小和图片的大小 确定比例,如果图片比控件大,我们就进行裁剪,否则不需要。decodeThumbBitmapForFile()方法是根据计算好了图片裁剪的比例之后 从文件中加载图片,我们先设置options.inJustDecodeBounds = true表示解析不占用内存,但是我们能获取图片的具体大小,利用computeScale()计算好比例,在将 options.inJustDecodeBounds=false,再次解析Bitmap,这样子就对图片进行了裁剪。
- loadNativeImage(final String path, final Point mPoint, final NativeImageCallBack mCallBack)我们在客户端只需要调用该方法就能获取到Bitmap对象,里面的具体逻辑是先判断内存缓存LruCache中是否存在该 Bitmap,不存在就开启子线程去读取,为了方便管理加载本地图片线程,这里使用了线程池,池中只能容纳一个线程,读取完了本地图片先将Bitmap加 入到LruCache中,保存的Key为图片路径,然后再使用Handler通知主线程图片加载好了,之后将Bitmap和路径回调到方法 onImageLoader(Bitmap bitmap, String path)中,该方法的mPoint是用来封装控件的宽和高的对象,如果不对图片进行裁剪直接这个方法的重载方法 loadNativeImage(final String path, final NativeImageCallBack mCallBack)就行了,逻辑是一样的,只是这个方法不对图片进行裁剪
接下来就是GridView的Adapter类的代码
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >List</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >content</span><span class = "pun" >.</span><span class = "typ" >Context</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Bitmap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Point</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >LayoutInflater</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >View</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >ViewGroup</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >BaseAdapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >GridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >ImageView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >TextView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >.</span><span class = "typ" >MyImageView</span><span class = "pun" >.</span><span class = "typ" >OnMeasureListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >.</span><span class = "typ" >NativeImageLoader</span><span class = "pun" >.</span><span class = "typ" >NativeImageCallBack</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >GroupAdapter</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >BaseAdapter</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Point</span><span class = "pln" > mPoint </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Point</span><span class = "pun" >(</span><span class = "lit" > 0 </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >);</span><span class = "com" > //用来封装ImageView的宽和高的对象</span><span class="pln"> </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "typ" >LayoutInflater</span><span class = "pln" > mInflater</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > getCount</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "pln" >size</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Object</span><span class = "pln" > getItem</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > long </span><span class = "pln" > getItemId</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > position</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >GroupAdapter</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGridView</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >list </span><span class = "pun" >=</span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >mGridView </span><span class = "pun" >=</span><span class = "pln" > mGridView</span><span class = "pun" >;</span><span class = "pln" > mInflater </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >LayoutInflater</span><span class = "pun" >.</span><span class = "kwd" >from</span><span class = "pun" >(</span><span class = "pln" >context</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > getView</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > convertView</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ViewGroup</span><span class = "pln" > parent</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pln" > viewHolder</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >ImageBean</span><span class = "pln" > mImageBean </span><span class = "pun" >=</span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path </span><span class = "pun" >=</span><span class = "pln" > mImageBean</span><span class = "pun" >.</span><span class = "pln" >getTopImagePath</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >convertView </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > viewHolder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pun" >();</span><span class = "pln" > convertView </span><span class = "pun" >=</span><span class = "pln" > mInflater</span><span class = "pun" >.</span><span class = "pln" >inflate</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >layout</span><span class = "pun" >.</span><span class = "pln" >grid_group_item</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >MyImageView</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >group_image</span><span class = "pun" >);</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mTextViewTitle </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >TextView</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >group_title</span><span class = "pun" >);</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mTextViewCounts </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >TextView</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >group_count</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //用来监听ImageView的宽和高</span><span class="pln"> viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setOnMeasureListener</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >OnMeasureListener</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onMeasureSize</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > width</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > height</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > mPoint</span><span class = "pun" >.</span><span class = "kwd" >set</span><span class = "pun" >(</span><span class = "pln" >width</span><span class = "pun" >,</span><span class = "pln" > height</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >setTag</span><span class = "pun" >(</span><span class = "pln" >viewHolder</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "kwd" > else </span><span class = "pun" >{</span><span class = "pln" > viewHolder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ViewHolder</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >getTag</span><span class = "pun" >();</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageResource</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >drawable</span><span class = "pun" >.</span><span class = "pln" >friends_sends_pictures_no</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mTextViewTitle</span><span class = "pun" >.</span><span class = "pln" >setText</span><span class = "pun" >(</span><span class = "pln" >mImageBean</span><span class = "pun" >.</span><span class = "pln" >getFolderName</span><span class = "pun" >());</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mTextViewCounts</span><span class = "pun" >.</span><span class = "pln" >setText</span><span class = "pun" >(</span><span class = "typ" >Integer</span><span class = "pun" >.</span><span class = "pln" >toString</span><span class = "pun" >(</span><span class = "pln" >mImageBean</span><span class = "pun" >.</span><span class = "pln" >getImageCounts</span><span class = "pun" >()));</span><span class = "pln" > </span><span class = "com" > //给ImageView设置路径Tag,这是异步加载图片的小技巧</span><span class="pln"> viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setTag</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //利用NativeImageLoader类加载本地图片</span><span class="pln"> </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pun" >.</span><span class = "pln" >getInstance</span><span class = "pun" >().</span><span class = "pln" >loadNativeImage</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > mPoint</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >NativeImageCallBack</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onImageLoader</span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ImageView</span><span class = "pln" > mImageView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ImageView</span><span class = "pun" >)</span><span class = "pln" > mGridView</span><span class = "pun" >.</span><span class = "pln" >findViewWithTag</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmap </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >&</span><span class = "pln" >amp</span><span class = "pun" >;&</span><span class = "pln" >amp</span><span class = "pun" >;</span><span class = "pln" > mImageView </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageBitmap</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmap </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageBitmap</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "kwd" > else </span><span class = "pun" >{</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageResource</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >drawable</span><span class = "pun" >.</span><span class = "pln" >friends_sends_pictures_no</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > convertView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >MyImageView</span><span class = "pln" > mImageView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >TextView</span><span class = "pln" > mTextViewTitle</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >TextView</span><span class = "pln" > mTextViewCounts</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
首先我们将每个item的图片路径设置到该ImageView上面,然后利用NativeImageLoader来加载本地图片,很普通,但是我们想在 getView()中获取ImageView的宽和高存在问题,在getView()里面刚开始显示item的时候利用 ImageView.getWidth()获取的都是0,这个比较郁闷,但是我们想要获取ImageView的宽和高怎么办呢?于是我想到了自定义 ImageView,在onMeasure()中利用回调的模式主动通知 我ImageView测量的宽和高,但是这有一个小小的问题,就是显示GridView的第一个item的时候,获取的宽和高还是0,第二个就能正常获取 了,第一个宽和高为0,我们不对第一张图片进行裁剪而已,在效率上也没啥问题,不知道大家有没有好的方法,可以在getView()中获取Item中某个控件的宽和高。
自定义MyImageView的代码,我们只需要设置OnMeasureListener监听,当MyImageView测量完毕之后,就会将测量的宽和高回调到onMeasureSize()中,然后我们可以根据MyImageView的大小来裁剪图片
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >content</span><span class = "pun" >.</span><span class = "typ" >Context</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >AttributeSet</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >ImageView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >MyImageView</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >ImageView</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >OnMeasureListener</span><span class = "pln" > onMeasureListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > setOnMeasureListener</span><span class = "pun" >(</span><span class = "typ" >OnMeasureListener</span><span class = "pln" > onMeasureListener</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >onMeasureListener </span><span class = "pun" >=</span><span class = "pln" > onMeasureListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >MyImageView</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >AttributeSet</span><span class = "pln" > attrs</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >(</span><span class = "pln" >context</span><span class = "pun" >,</span><span class = "pln" > attrs</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >MyImageView</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >AttributeSet</span><span class = "pln" > attrs</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > defStyle</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >(</span><span class = "pln" >context</span><span class = "pun" >,</span><span class = "pln" > attrs</span><span class = "pun" >,</span><span class = "pln" > defStyle</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onMeasure</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > widthMeasureSpec</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > heightMeasureSpec</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onMeasure</span><span class = "pun" >(</span><span class = "pln" >widthMeasureSpec</span><span class = "pun" >,</span><span class = "pln" > heightMeasureSpec</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //将图片测量的大小回调到onMeasureSize()方法中</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >onMeasureListener </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > onMeasureListener</span><span class = "pun" >.</span><span class = "pln" >onMeasureSize</span><span class = "pun" >(</span><span class = "pln" >getMeasuredWidth</span><span class = "pun" >(),</span><span class = "pln" > getMeasuredHeight</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > interface </span><span class = "pln" > </span><span class = "typ" >OnMeasureListener</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onMeasureSize</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > width</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > height</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
上面这些代码就完成了第一个界面的功能了,接下来就是点击GridView的item跳转另一个界面来显示该文件夹下面的所有图片,功能跟第一个界面差不多,也是使用GridView来显示图片,第二个界面的布局代码我就不贴了,直接贴上界面的代码
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >List</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >app</span><span class = "pun" >.</span><span class = "typ" >Activity</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >os</span><span class = "pun" >.</span><span class = "typ" >Bundle</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >GridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >Toast</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ShowImageActivity</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >Activity</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >ChildAdapter</span><span class = "pln" > adapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onCreate</span><span class = "pun" >(</span><span class = "typ" >Bundle</span><span class = "pln" > savedInstanceState</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onCreate</span><span class = "pun" >(</span><span class = "pln" >savedInstanceState</span><span class = "pun" >);</span><span class = "pln" > setContentView</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >layout</span><span class = "pun" >.</span><span class = "pln" >show_image_activity</span><span class = "pun" >);</span><span class = "pln" > mGridView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >GridView</span><span class = "pun" >)</span><span class = "pln" > findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >child_grid</span><span class = "pun" >);</span><span class = "pln" > list </span><span class = "pun" >=</span><span class = "pln" > getIntent</span><span class = "pun" >().</span><span class = "pln" >getStringArrayListExtra</span><span class = "pun" >(</span><span class = "str" > "data" </span><span class = "pun" >);</span><span class = "pln" > adapter </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ChildAdapter</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > list</span><span class = "pun" >,</span><span class = "pln" > mGridView</span><span class = "pun" >);</span><span class = "pln" > mGridView</span><span class = "pun" >.</span><span class = "pln" >setAdapter</span><span class = "pun" >(</span><span class = "pln" >adapter</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onBackPressed</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >Toast</span><span class = "pun" >.</span><span class = "pln" >makeText</span><span class = "pun" >(</span><span class = "kwd" > this </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "str" > "选中 " </span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > adapter</span><span class = "pun" >.</span><span class = "pln" >getSelectItems</span><span class = "pun" >().</span><span class = "pln" >size</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >+</span><span class = "pln" > </span><span class = "str" > " item" </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Toast</span><span class = "pun" >.</span><span class = "pln" >LENGTH_LONG</span><span class = "pun" >).</span><span class = "pln" >show</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > super </span><span class = "pun" >.</span><span class = "pln" >onBackPressed</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
GridView的item上面一个我们自定义的MyImageView用来显示图片,另外还有一个CheckBox来记录我们选中情况,Adapter的代码如下
<span class = "kwd" > package </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >ArrayList</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >HashMap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >Iterator</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >List</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > java</span><span class = "pun" >.</span><span class = "pln" >util</span><span class = "pun" >.</span><span class = "typ" >Map</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >content</span><span class = "pun" >.</span><span class = "typ" >Context</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Bitmap</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >graphics</span><span class = "pun" >.</span><span class = "typ" >Point</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >LayoutInflater</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >View</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >view</span><span class = "pun" >.</span><span class = "typ" >ViewGroup</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >BaseAdapter</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >CheckBox</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >CompoundButton</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >ImageView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >CompoundButton</span><span class = "pun" >.</span><span class = "typ" >OnCheckedChangeListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > android</span><span class = "pun" >.</span><span class = "pln" >widget</span><span class = "pun" >.</span><span class = "typ" >GridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >.</span><span class = "typ" >MyImageView</span><span class = "pun" >.</span><span class = "typ" >OnMeasureListener</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >example</span><span class = "pun" >.</span><span class = "pln" >imagescan</span><span class = "pun" >.</span><span class = "typ" >NativeImageLoader</span><span class = "pun" >.</span><span class = "typ" >NativeImageCallBack</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >nineoldandroids</span><span class = "pun" >.</span><span class = "pln" >animation</span><span class = "pun" >.</span><span class = "typ" >AnimatorSet</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > import </span><span class = "pln" > com</span><span class = "pun" >.</span><span class = "pln" >nineoldandroids</span><span class = "pun" >.</span><span class = "pln" >animation</span><span class = "pun" >.</span><span class = "typ" >ObjectAnimator</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ChildAdapter</span><span class = "pln" > </span><span class = "kwd" > extends </span><span class = "pln" > </span><span class = "typ" >BaseAdapter</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >Point</span><span class = "pln" > mPoint </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >Point</span><span class = "pun" >(</span><span class = "lit" > 0 </span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 </span><span class = "pun" >);</span><span class = "com" > //用来封装ImageView的宽和高的对象</span><span class="pln"> </span><span class = "com" > /** * 用来存储图片的选中情况 */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >HashMap</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Integer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Boolean</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > mSelectMap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >HashMap</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Integer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Boolean</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;();</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGridView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > protected </span><span class = "pln" > </span><span class = "typ" >LayoutInflater</span><span class = "pln" > mInflater</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >ChildAdapter</span><span class = "pun" >(</span><span class = "typ" >Context</span><span class = "pln" > context</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >GridView</span><span class = "pln" > mGridView</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >list </span><span class = "pun" >=</span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > this </span><span class = "pun" >.</span><span class = "pln" >mGridView </span><span class = "pun" >=</span><span class = "pln" > mGridView</span><span class = "pun" >;</span><span class = "pln" > mInflater </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >LayoutInflater</span><span class = "pun" >.</span><span class = "kwd" >from</span><span class = "pun" >(</span><span class = "pln" >context</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > getCount</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "pln" >size</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >Object</span><span class = "pln" > getItem</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > long </span><span class = "pln" > getItemId</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > position</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > getView</span><span class = "pun" >(</span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > position</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >View</span><span class = "pln" > convertView</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >ViewGroup</span><span class = "pln" > parent</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > final </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pln" > viewHolder</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path </span><span class = "pun" >=</span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >convertView </span><span class = "pun" >==</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > convertView </span><span class = "pun" >=</span><span class = "pln" > mInflater</span><span class = "pun" >.</span><span class = "pln" >inflate</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >layout</span><span class = "pun" >.</span><span class = "pln" >grid_child_item</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >);</span><span class = "pln" > viewHolder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pun" >();</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >MyImageView</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >child_image</span><span class = "pun" >);</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mCheckBox </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >CheckBox</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >findViewById</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >id</span><span class = "pun" >.</span><span class = "pln" >child_checkbox</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //用来监听ImageView的宽和高</span><span class="pln"> viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setOnMeasureListener</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >OnMeasureListener</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onMeasureSize</span><span class = "pun" >(</span><span class = "kwd" > int </span><span class = "pln" > width</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > int </span><span class = "pln" > height</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > mPoint</span><span class = "pun" >.</span><span class = "kwd" >set</span><span class = "pun" >(</span><span class = "pln" >width</span><span class = "pun" >,</span><span class = "pln" > height</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >setTag</span><span class = "pun" >(</span><span class = "pln" >viewHolder</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "kwd" > else </span><span class = "pun" >{</span><span class = "pln" > viewHolder </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ViewHolder</span><span class = "pun" >)</span><span class = "pln" > convertView</span><span class = "pun" >.</span><span class = "pln" >getTag</span><span class = "pun" >();</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageResource</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >drawable</span><span class = "pun" >.</span><span class = "pln" >friends_sends_pictures_no</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setTag</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mCheckBox</span><span class = "pun" >.</span><span class = "pln" >setOnCheckedChangeListener</span><span class = "pun" >(</span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >OnCheckedChangeListener</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onCheckedChanged</span><span class = "pun" >(</span><span class = "typ" >CompoundButton</span><span class = "pln" > buttonView</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > boolean </span><span class = "pln" > isChecked</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "com" > //如果是未选中的CheckBox,则添加动画</span><span class="pln"> </span><span class = "kwd" > if </span><span class = "pun" >(!</span><span class = "pln" >mSelectMap</span><span class = "pun" >.</span><span class = "pln" >containsKey</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >||</span><span class = "pln" > </span><span class = "pun" >!</span><span class = "pln" >mSelectMap</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >)){</span><span class = "pln" > addAnimation</span><span class = "pun" >(</span><span class = "pln" >viewHolder</span><span class = "pun" >.</span><span class = "pln" >mCheckBox</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > mSelectMap</span><span class = "pun" >.</span><span class = "pln" >put</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >,</span><span class = "pln" > isChecked</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mCheckBox</span><span class = "pun" >.</span><span class = "pln" >setChecked</span><span class = "pun" >(</span><span class = "pln" >mSelectMap</span><span class = "pun" >.</span><span class = "pln" >containsKey</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >?</span><span class = "pln" > mSelectMap</span><span class = "pun" >.</span><span class = "kwd" >get</span><span class = "pun" >(</span><span class = "pln" >position</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >:</span><span class = "pln" > </span><span class = "kwd" > false </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "com" > //利用NativeImageLoader类加载本地图片</span><span class="pln"> </span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "typ" >NativeImageLoader</span><span class = "pun" >.</span><span class = "pln" >getInstance</span><span class = "pun" >().</span><span class = "pln" >loadNativeImage</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >,</span><span class = "pln" > mPoint</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >NativeImageCallBack</span><span class = "pun" >()</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "lit" > @Override </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > onImageLoader</span><span class = "pun" >(</span><span class = "typ" >Bitmap</span><span class = "pln" > bitmap</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >String</span><span class = "pln" > path</span><span class = "pun" >)</span><span class = "pln" > </span><span class = "pun" >{</span><span class = "pln" > </span><span class = "typ" >ImageView</span><span class = "pln" > mImageView </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "pun" >(</span><span class = "typ" >ImageView</span><span class = "pun" >)</span><span class = "pln" > mGridView</span><span class = "pun" >.</span><span class = "pln" >findViewWithTag</span><span class = "pun" >(</span><span class = "pln" >path</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmap </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pln" > </span><span class = "pun" >&</span><span class = "pln" >amp</span><span class = "pun" >;&</span><span class = "pln" >amp</span><span class = "pun" >;</span><span class = "pln" > mImageView </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageBitmap</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >});</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >bitmap </span><span class = "pun" >!=</span><span class = "pln" > </span><span class = "kwd" > null </span><span class = "pun" >){</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageBitmap</span><span class = "pun" >(</span><span class = "pln" >bitmap</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "kwd" > else </span><span class = "pun" >{</span><span class = "pln" > viewHolder</span><span class = "pun" >.</span><span class = "pln" >mImageView</span><span class = "pun" >.</span><span class = "pln" >setImageResource</span><span class = "pun" >(</span><span class = "pln" >R</span><span class = "pun" >.</span><span class = "pln" >drawable</span><span class = "pun" >.</span><span class = "pln" >friends_sends_pictures_no</span><span class = "pun" >);</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > convertView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 给CheckBox加点击动画,利用开源库nineoldandroids设置动画 * @param view */ </span><span class = "pln" > </span><span class = "kwd" > private </span><span class = "pln" > </span><span class = "kwd" > void </span><span class = "pln" > addAnimation</span><span class = "pun" >(</span><span class = "typ" >View</span><span class = "pln" > view</span><span class = "pun" >){</span><span class = "pln" > </span><span class = "kwd" > float </span><span class = "pln" > </span><span class = "pun" >[]</span><span class = "pln" > vaules </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "kwd" > float </span><span class = "pun" >[]{</span><span class = "lit" > 0 .5f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 .6f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 .7f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 .8f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 0 .9f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .0f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .1f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .2f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .3f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .25f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .2f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .15f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .1f</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "lit" > 1 .0f</span><span class = "pun" >};</span><span class = "pln" > </span><span class = "typ" >AnimatorSet</span><span class = "pln" > </span><span class = "kwd" >set</span><span class = "pln" > </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >AnimatorSet</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" >set</span><span class = "pun" >.</span><span class = "pln" >playTogether</span><span class = "pun" >(</span><span class = "typ" >ObjectAnimator</span><span class = "pun" >.</span><span class = "pln" >ofFloat</span><span class = "pun" >(</span><span class = "pln" >view</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "str" > "scaleX" </span><span class = "pun" >,</span><span class = "pln" > vaules</span><span class = "pun" >),</span><span class = "pln" > </span><span class = "typ" >ObjectAnimator</span><span class = "pun" >.</span><span class = "pln" >ofFloat</span><span class = "pun" >(</span><span class = "pln" >view</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "str" > "scaleY" </span><span class = "pun" >,</span><span class = "pln" > vaules</span><span class = "pun" >));</span><span class = "pln" > </span><span class = "kwd" >set</span><span class = "pun" >.</span><span class = "pln" >setDuration</span><span class = "pun" >(</span><span class = "lit" > 150 </span><span class = "pun" >);</span><span class = "pln" > </span><span class = "kwd" >set</span><span class = "pun" >.</span><span class = "pln" >start</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "com" > /** * 获取选中的Item的position * @return */ </span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > getSelectItems</span><span class = "pun" >(){</span><span class = "pln" > </span><span class = "typ" >List</span><span class = "pln" > list </span><span class = "pun" >=</span><span class = "pln" > </span><span class = "kwd" > new </span><span class = "pln" > </span><span class = "typ" >ArrayList</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > for </span><span class = "pun" >(</span><span class = "typ" >Iterator</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Map</span><span class = "pun" >.</span><span class = "typ" >Entry</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Integer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Boolean</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > it </span><span class = "pun" >=</span><span class = "pln" > mSelectMap</span><span class = "pun" >.</span><span class = "pln" >entrySet</span><span class = "pun" >().</span><span class = "pln" >iterator</span><span class = "pun" >();</span><span class = "pln" > it</span><span class = "pun" >.</span><span class = "pln" >hasNext</span><span class = "pun" >();){</span><span class = "pln" > </span><span class = "typ" >Map</span><span class = "pun" >.</span><span class = "typ" >Entry</span><span class = "pun" >&</span><span class = "pln" >lt</span><span class = "pun" >;</span><span class = "typ" >Integer</span><span class = "pun" >,</span><span class = "pln" > </span><span class = "typ" >Boolean</span><span class = "pun" >&</span><span class = "pln" >gt</span><span class = "pun" >;</span><span class = "pln" > entry </span><span class = "pun" >=</span><span class = "pln" > it</span><span class = "pun" >.</span><span class = "kwd" >next</span><span class = "pun" >();</span><span class = "pln" > </span><span class = "kwd" > if </span><span class = "pun" >(</span><span class = "pln" >entry</span><span class = "pun" >.</span><span class = "pln" >getValue</span><span class = "pun" >()){</span><span class = "pln" > list</span><span class = "pun" >.</span><span class = "pln" >add</span><span class = "pun" >(</span><span class = "pln" >entry</span><span class = "pun" >.</span><span class = "pln" >getKey</span><span class = "pun" >());</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > return </span><span class = "pln" > list</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "kwd" > static </span><span class = "pln" > </span><span class = "kwd" > class </span><span class = "pln" > </span><span class = "typ" >ViewHolder</span><span class = "pun" >{</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >MyImageView</span><span class = "pln" > mImageView</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "kwd" > public </span><span class = "pln" > </span><span class = "typ" >CheckBox</span><span class = "pln" > mCheckBox</span><span class = "pun" >;</span><span class = "pln" > </span><span class = "pun" >}</span><span class = "pln" > </span><span class = "pun" >}</span> |
第二个界面的Adapter跟第一个界面差不多,无非多了一个CheckBox用来记录图片选择情况,我们只需要对CheckBox设置 setOnCheckedChangeListener监听,微信的选中之后CheckBox有一个动画效果,所以我利用nineoldAndroids 动画库也给CheckBox加了一个动画效果,直接调用addAnimation()方法就能添加了,getSelectItems()方法就能获取我们 选中的item的position了,知道了选中的position,其他的信息就都知道了,微信有对图片进行预览的功能,我这里就不添加了,如果有这个 需求可以自行添加,给大家推荐一个https://github.com/chrisbanes/PhotoView
运行项目,效果如下
看 起来还不错吧,采用的是异步读取图片,对图片进行了缓存和裁剪,使得在显示本地图片方面比较流畅,GridView滑动也挺流畅的,也有效的避免OOM的 产生,工程中有些东西还没有贴完全,有兴趣的朋友可以下载Demo来运行一下,好了,今天的讲解到这里结束了,感谢大家观看,希望这篇有疑问的朋友可以在 下面留言,我会为大家解答的!