[转载]Android 使用ContentProvider扫描手机中的图片,仿微信显示本地图片效果 - Mobile Internet developer - 博客频道 - CSDN.NET

[转载]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">
 
&nbsp;
 
&nbsp;</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">/**
*
* @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()方法加载本地图片,此类可作为一个加载本地图片的工具类
*
*
* @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>
  1. 该类是一个单例类,提供了本地图片加载,内存缓存,裁剪等逻辑,该类在加载本地图片的时候采用的是异步加载的方式,对于大图片的加载也是 比较耗时的,所以采用子线程的方式去加载,对于图片的缓存机制使用的是LruCache,使用手机分配给应用程序内存的1/4用来缓存图片,除了使用 LruCache缓存图片之外,还对图片进行了裁剪,举个很简单的例子,假如我们的控件大小是100 * 100, 而我们的图片是400*400,我们加载这么大的图片需要很多的内存,所以我们采用了图片裁剪,根据控件的大小来确定图片的裁剪比例,从而减小内存的消 耗,提过GridView滑动的流畅度,介绍里面几个比较重要的方法,computeScale()计算图片需要裁剪的比例,根据控件的大小和图片的大小 确定比例,如果图片比控件大,我们就进行裁剪,否则不需要。decodeThumbBitmapForFile()方法是根据计算好了图片裁剪的比例之后 从文件中加载图片,我们先设置options.inJustDecodeBounds = true表示解析不占用内存,但是我们能获取图片的具体大小,利用computeScale()计算好比例,在将 options.inJustDecodeBounds=false,再次解析Bitmap,这样子就对图片进行了裁剪。
  2. 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来运行一下,好了,今天的讲解到这里结束了,感谢大家观看,希望这篇有疑问的朋友可以在 下面留言,我会为大家解答的!

项目源码,点击下载

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

登录

注册