您的位置:首页 > 移动开发 > Android开发

Android 2.3 Gallery3D添加gif支持——概要(一)

2012-10-08 10:15 387 查看
说到gif,目前很多Android软件都具备了该功能,比如新浪微博。在Android 2.3平台中,系统自带的图片查看应用是Gallery3D,其并不具有播放gif图片的功能。Gallery3D是一家叫做cooliris公司***的一款Android图片浏览应用,因其具备3D特效,因此称之为Gallery3D,这也与Android自带的Gallery区分开。想了解更多关于Gallery3D的信息可以查看这里。个人觉得,其实Android
2.3中的Gallery3D还是很复杂的,也是很值得研究的,本次只是因为工作原因涉及到其冰山一角,特留此笔记以备忘。

欢迎转载,请务必注明出处:http://blog.csdn.net/yihongyuelan

对于gif的添加,文章会大致分成三个部分:

(1)概要;主要涉及Gallery3D基础知识。

(2)显示图片流程;主要涉及缩略图和大图的显示。

(3)代码框架。给Gallery3D添加gif支持,使之能够正常播放。

文章的目的很简单,一方面给自己留作笔记,另一方面作为回顾。文中并不会对Gallery3D展开去将,主要是围绕主线"添加gif支持",因此很多地方可能并不是那么详细,也有可能我自己也没弄清楚的,文章的结尾我将给出一些参考资料,有兴趣研究的朋友可以自己参考并学习。

GIF(Graphics Interchange Format)的原义是“图像互换格式”,是CompuServe公司在 1987年开发的图像文件格式。GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。其压缩率一般在50%左右,它不属于任何应用程序。GIF图像文件的数据是经过压缩的,而且是采用了可变长度等压缩算法。GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。(来自百度百科)

Gallery3D的界面生成和普通的应用程序不一样。Gallery3D的界面是通过openGL画出来的,整个界面在一个Activity中,如主界面,缩略图界面,单张图片查看界面,标记界面等都属于同一个Activity。

Gallery3D从整体上来讲,具有两种模式:标记模式以及普通模式。标记模式也就是多选模式,包括了:主界面标记模式,缩略界面矩阵浏览标记模式,缩略图界面分类浏览时标记模式3个界面。普通模式包括:主界面浏览模式,缩略图矩阵浏览模式,查看界面模式,缩略图界面分类浏览模式。听起来有点绕口,图1比较清晰的展示了Gallery3D中的基本模式,如图1:



图 1

下面是Gallery3D的基本组件,包括:
com.cooliris.media.GridLayer :网格缩略图和个体图片展示

com.cooliris.media.BackgroundLayer:Gallery3D背景

com.cooliris.media.HudLayer:相册展示

com.cooliris.media.ImageButton:图片按钮

com.cooliris.media.TimeBar:Gallery3D中下方可拖动的悬浮控件

com.cooliris.media.MenuBar :点击图片时弹出菜单按钮

com.cooliris.media.PopupMenu:弹出菜单项

com.cooliris.media.PathBarLayer:显示路径控件
如图2所示:









图 2
Gallery3D的大致工作流程:

1.Cache的创建。
Gallery3D中的CacheService也会对这些媒体文件进行缩略图的创建,SD卡上图片缩略图粗放路径/mnt/sdcard/Android/data/com.cooliris.media/中,这里保存的并不是一张张的缩略图片,而是cache文件。(注:当插入SD卡后,MediaScanner会对SD卡进行扫面,并将扫描到的媒体文件的各种属性存入数据库中(data/data/com.android.providers.media/databases/external-xxxxx.db),同时MediaScanner会生成扫描到的媒体文件的缩略图,存放在/sdcard/DCIM/.thumnails
下面,这个是平台生成的,供一些需要使用它的app通过mediastore去调用)

2.缩略图显示。
在Gallery3D中,缩略图是显示在一个个固定宽高(在GridLayer中设定)的方框中,从数据库中获取图片信息(CacheService.getImageList),然后用OpenGL将缩略图画到画布上去,CacheService中的refresh()方法负责建立相册并把图片放到相册中。

3.大图片显示。
大图片的显示,就是当我们点击一张缩略图时显示的图片。具体方法是根据数据库中图片的路径找到对应SD卡中的图片,然后把图片加载到cache块中(CacheCrc64(Item.mFlie)方法把路径转换成cacheid),其中的mFile即是图片在SD卡中的路径(从数据库找到存入Item中),而这个mFiled对应的缓存块的设置是在writeItemsToCache()方法中(另外还有一个writeSetsToCache方法)。最后调用了GridDrawManager.drawFocusItems()来绘制图片,并最终显示到界面上。
以上流程只是Gallery3D工作流程的极小一部分,本文主要目的是大致了解Gallery3D。文章结尾处给出部分网友的分析,根据这些信息加上自己跟踪代码得到了以上结论,如有不正之处还恳请指正。

Gallery3D工作流程:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=40903&extra=&highlight=&page=1
Gallery3D介绍:http://blog.sina.com.cn/s/blog_972577b301010qmj.htmlhttp://blog.csdn.net/hopesjd/article/details/7716410
Cache处理流程: http://www.eoeandroid.com/thread-41920-1-1.html Gallery3D源码分析汇总(推荐): http://wenku.baidu.com/view/25ecc9d87f1922791688e8fc.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: