說到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