本文不涉及UI方面的内容, 如果您是希望了解UI方面的访客, 请跳过此文.

本文将要详细介绍如何实现流畅加载本地图库. 像平时用得比较多应用, 如微信(见下图), 微博等应用, 都实现了图库功能, 其中主要功能包括:

  • 默认显示所有图片
  • 按目录显示图片

另外, 界面要素包括:

  • 图片缩略图
  • 图片目录列表以及目录中包含的图片数

讨论: 在Android上, 如何实现流畅加载本地照片的相册?

知识要点

  p.s. 实现图库的难点就在于, 如何快速的查询出图片以及目录信息, 貌似 Android 没有直接提供这样的接口, 我们只可以用 android.provider.MediaStore.Images.Media 和 android.provider.MediaStore.Images.Thumbnails. 我们虽然能使用 Thumbnails 查询出缩略图信息和图片ID, 但是它没有提供图片的详细信息, 另外, 如果用于保存缩略图的信息或者目录被(意外或者人为)删除了, 那使用 Thumbnails 基本上就没有什么意义了. 因此, 我们在这里使用 Media 来查询图片以及目录.

实现代码

> 定义

static final Uri CONTENT_URI = Media.EXTERNAL_CONTENT_URI;
static final String SORT_ORDER = Media.DATE_MODIFIED + " DESC";

  在这里, 我们只查询sdcard上的图片, 并按照修改时间倒序排列.

> 查询图片

  代码略, 直接使用 CursorLoader 按 SORT_ORDER 顺序加载图片, 如果指定了目录, 则设置 Media.BUCKET_ID + "=?" 的查询条件

> 查询目录

  和查询图片一样, 也使用CursorLoader来加载数据, 只不过设置的参数不同而已, 如下:

// 方法一
static final String[] PROJECTION_D = {
              "DISTINCT " + Media.BUCKET_ID,
              Media.BUCKET_DISPLAY_NAME,
              "COUNT(*) AS " + Media._COUNT};
// 方法二
static final String[] PROJECTION = {
              Media.BUCKET_ID,
              Media.BUCKET_DISPLAY_NAME,
              Media._ID,
              "COUNT(*) AS " + Media._COUNT};
static final String SELECTION = "1=1) GROUP BY (" + Media.BUCKET_ID;
static final String[] SELECTION_ARGS = null;

  需要说明的是, 如果对应的目录不需要显示首张图片的缩略图, 那么可以使用方法一, 否则使用方法二(PROJECTION 要与 SELETION 配合使用, 而方法一不需要). 其他参数对应设置到CursorLoader即可.

优化策略

  最后, 需要提到的一点就是, 我们使用 UIL(即, Android Universal Image Loader) 加载图片, 但是每次加载都是我们查询出来的原图, 按照github上演示代码的全局初始设定, 加载到三五屏, 第一屏的图片就已经不在内存缓存里, 如果重新滚动到第一屏要显示第一屏图片的话, 就还得从原图读取, 用户体验就很差了. 而我们看到Android相册, 微信相册等应用, 加载很流畅. 通过观察这些应用缓存, 能看到只要浏览很多未被浏览的图片, 那缓存就会变大. 因此, 可以想到的可实现的方式就是:

  • 利用UIL缓存原图为较小尺寸的缩略图, 比如320px或者96px

到这里, 按此方法实现的图库的性能以及用户体验基本和Android相册差不多了. 此方法唯一不足的是, 需要应用自己缓存缩略图, 可以假想下, 如果手机上已安装的80%的应用都有这样的一个功能页面, 那岂不是每个应用都要自己生成一套缩略图?

END.

Android开发案例 - 图库的更多相关文章

  1. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  2. Android开发案例 设置背景图片轮播

    点击按钮实现图片轮播效果 实践案例: xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  3. Android开发案例 – 在AbsListView中使用倒计时

    在App中, 有多种多样的倒计时需求, 比如: 在单View上, 使用倒计时, 如(如图-1) 在ListView(或者GridView)的ItemView上, 使用倒计时(如图-2) 图-1 图-2 ...

  4. Android开发案例 - 淘宝商品详情

    所有电商APP的商品详情页面几乎都是和淘宝的一模一样(见下图): 采用上下分页的模式 商品基本参数 & 选购参数在上页展示 商品图文详情等其他信息放在下页展示 知识要点 垂直方向的ViewPa ...

  5. Android开发案例 - 自定义虚拟键盘

    所有包含IM功能的App(如微信, 微博, QQ, 支付宝等)都提供了Emoji表情之类的虚拟键盘,  如下图:    本文只着重介绍如何实现输入法键盘和自定义虚拟键盘的流畅切换, 而不介绍如何实现虚 ...

  6. [Deprecated!] Android开发案例 - 微博正文

    Deprecated! 更好的实现方式: 使用 android.support.design.widget.CoordinatorLayout. 本文详细介绍如何实现如下图中的微博正文页面效果, 其中 ...

  7. Android开发案例 - 欢迎界面

    本文详细描述了如何实现如下图中的微信启动界面. 该类启动界面的特点是在整个Application的生命周期里, 它只会出现在第一次进入应用时, 即便按回退键到桌面之后. 使用该类启动界面的应用还有: ...

  8. Android开发案例 - 淘宝商品详情【转】

    http://erehmi.cnblogs.com/ 所有电商APP的商品详情页面几乎都是和淘宝的一模一样(见下图): 采用上下分页的模式 商品基本参数 & 选购参数在上页展示 商品图文详情等 ...

  9. Android开发案例 点击按钮出现 简易的消息提示框

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

随机推荐

  1. ASP.NET 5 (vNext) Linux部署

    引言 工欲善其事,必先利其器. 首先,我们先明确下以下基本概念 Linux相关 Ubuntu Ubuntu是基于linux的免费开源桌面PC操作系统 十分契合英特尔的超极本定位 支持x86.64位和p ...

  2. 疯狂的JSONP

    何为跨域?何为JSONP?JSONP技术能实现什么?是否有必要使用JSONP技术? 跨域 就是由于JavaScript同源策略的限制,使得a.com域名下的js无法操作b.com或c.a.com域名下 ...

  3. Spring Boot -- 启动彩蛋

    使用Spring Boot启动的jar包总是会显示一个Spring的图标: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\_ ...

  4. Sublime Text 全程指引 by Lucida

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 博客园:@figure9 原文链接:http://zh.lucida.me/blog/sublime-text-complete ...

  5. 4.修改更新源sources.list,提高软件下载安装速度(提供Kali 2.0 更新源)

    1.切换到root用户(如果已经是root用户就直接看第二步) dnt@HackerKali:~$ su 密码: 2.用文本编辑器打开sources.list,手动添加下面的更新源 root@Hack ...

  6. 阿里云系列——6.给你的域名使用CDN加速(详细步骤+简单配置)

    网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 进入管理页面:https://home.console.aliyun.com/ ...

  7. 今天有群友不是很清楚htm直接存数据库的危害,我简单举个例子

     通过这个案例就知道为什么不要把原生的html放数据库了  常见的几种转码  常用的几种显示方法 只有原生html和最下面一种弹框了,变成了持久xss 如果是Ajax的方式,请用@Ajax.JavaS ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(25)-权限管理系统-系统管理员(附生成器)

    系列目录 这一节我们要着手建立系统管理员表,但发布之前,我先发布一个代码生成器给大家先用着. 这个生成器是为这个项目而生的,理论不能用于其他项目,而且写得比较潦草,但能用 下载地址 有兴趣要生成器源码 ...

  9. 聊聊excel生成图片的几种方式

    目录     I:需求.  II:实现思路.     III:实现方式.     IV:优缺点分析.     V:结论.     VI:wps安装与配置. 正文 1.需求:把excel生成等比的图片. ...

  10. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...