摘要:渲染和事件處理通過(guò)這個(gè)數(shù)結(jié)構(gòu)傳遞。對(duì)應(yīng)的數(shù)據(jù)適配器分別是。用圖形表示如下數(shù)據(jù)模型和數(shù)據(jù)流分析數(shù)據(jù)適配器是數(shù)據(jù)到的橋梁,連接數(shù)據(jù)源和。由管理,等在初始化的時(shí)候會(huì)通過(guò)獲取一個(gè),這個(gè)就是的數(shù)據(jù)的最終來(lái)源,即數(shù)據(jù)適配器的數(shù)據(jù)來(lái)源。
概述
??圖庫(kù)和相機(jī)在內(nèi)部實(shí)現(xiàn)上其實(shí)是共用的一個(gè)app,即Gallery2。它們是Gallery2的兩個(gè)不同的入口。圖庫(kù)的主要功能是展示和管理設(shè)備中的或者網(wǎng)絡(luò)上的媒體內(nèi)容(照片、視頻),雖然名字是圖庫(kù),但是其功能不僅僅限于圖片。其代碼位于packages/apps/Gallery2。
UI技術(shù)分析??打開(kāi)圖庫(kù)應(yīng)用首先看到的是相冊(cè)縮略圖,點(diǎn)擊一個(gè)相冊(cè)后進(jìn)入這個(gè)相冊(cè)中的照片的縮略圖,點(diǎn)擊一個(gè)照片的縮略圖后進(jìn)入單張照片模式。這些不同的UI之間的切換并沒(méi)有使用不同的Activity,而是在同一個(gè)Actvity中進(jìn)行的。這個(gè)Activity是GalleryActivity(有兩個(gè)GalleryActivity,這兒指的是com.android.gallery3d.app包中的)。布局文件是main.xml,其主要內(nèi)容如下:
接著看gl_root_group.xml,其內(nèi)容如下:
??這就是圖庫(kù)UI實(shí)現(xiàn)的特殊之處。GLRootView繼承自GLSurfaceView。實(shí)際上Gallery2基于GLSurfaceView實(shí)現(xiàn)了一套UI控件,這套UI組件畫(huà)在這個(gè)GLSurfaceView上。Gallery2的圖庫(kù)功能的UI實(shí)現(xiàn)沒(méi)有采用Android通常的View控件系統(tǒng)。Gallery2實(shí)現(xiàn)了GLView、GLRootView、GLCanvas等。GLView就相當(dāng)于通常Android控件體系中的View,它是所有控件的父類(lèi)。GLView可以接收觸摸事件,并把自己畫(huà)到GLCanvas上,GLCanvas是一個(gè)接口其實(shí)現(xiàn)有GLES11Canvas、GLES20Canvas。GLCanvas把自己繪制到GLSurfaceView中。接著說(shuō)GLView,一個(gè)GLView可以有零個(gè)或多個(gè)子GLView,它們形成一個(gè)樹(shù)結(jié)構(gòu)。渲染和事件處理通過(guò)這個(gè)數(shù)結(jié)構(gòu)傳遞。GLView必需加入到(Attach)GLRoot中才能完成渲染和接收事件。GLView可以通過(guò)調(diào)用GLRoot的requestRender()和requestLayoutContentPane()方法實(shí)現(xiàn)GLView樹(shù)的渲染和布局。
??GLRootView除了繼承自GLSurfaceView之外還實(shí)現(xiàn)了GLRoot接口。是所有GLView的根控件。即整個(gè)GLView樹(shù)是添加在它上面的,這通過(guò)GLRootView的setContentPane方法實(shí)現(xiàn),有些類(lèi)似于Activity的setContentView。GLView的渲染在GL線程中進(jìn)行,事件處理在主線程中進(jìn)行。這兩個(gè)線程需要同步。在事件處理和布局的時(shí)候GLRootView會(huì)獲取一個(gè)鎖,從而避免渲染線程在這個(gè)時(shí)候執(zhí)行。這個(gè)鎖就是GLRootView中的mRenderLock。
??總結(jié)一下就是Gallery2不同于一般app之處是它的控件從GLView繼承而不是View,GLView渲染在GLSurfaceView中。Gallery2實(shí)現(xiàn)了自己的一套UI控件系統(tǒng)。
??根據(jù)UI技術(shù)分析一節(jié)可以知道圖庫(kù)功能界面的切換本質(zhì)上時(shí)GalleryActivity中GLSurfaceView中GLView的切換。或者可以說(shuō)GalleryActivity有相冊(cè)縮略圖(AlbumSetPage)、相冊(cè)照片縮略圖(AlbumPage)、單張照片(PhotoPage)、幻燈片(SlideshowPage)四種不同的狀態(tài)(ActivityState)。實(shí)際上AlbumSetPage、AlbumPage、PhotoPage、SlideshowPage都繼承自ActivityState,并且它們之間的切換由StateManager來(lái)管理。每一個(gè)ActivityState都有一個(gè)GLView樹(shù),這個(gè)樹(shù)的根節(jié)點(diǎn)是ActivityState中定義的mContentPane。
??對(duì)應(yīng)AlbumSetPage、AlbumPage、PhotoPage、SlideshowPage分別是SlotView、SlotView、PhotoView、SlideshowView。對(duì)應(yīng)的數(shù)據(jù)適配器分別是AlbumSetDataLoader、AlbumDataLoader、PhotoDataAdapter、SlideshowDataAdapter。用圖形表示如下:
??數(shù)據(jù)適配器(Adapter)是數(shù)據(jù)到UI的橋梁,連接數(shù)據(jù)源和UI。Gallery2中數(shù)據(jù)源是MediaSource,MediaSource創(chuàng)建MediaObject實(shí)例,GLView渲染的就是一個(gè)個(gè)的MediaObject。MediaSource由DataManager管理,AlbumSetPage等ActivityState在初始化的時(shí)候會(huì)通過(guò)DataManager獲取一個(gè)MediaObject,這個(gè)MediaObject就是ActivityState的數(shù)據(jù)的最終來(lái)源,即數(shù)據(jù)適配器的數(shù)據(jù)來(lái)源。界面(AlbumSetPage等ActivityState的子類(lèi))沒(méi)有直接和MediaSource打交道,MediaSource被封裝在了DataManager中。
??MediaSource的子類(lèi)有LocalSource、PicasaSource、ComboSource(一個(gè)組合源,組合了LocalSource和PicasaSource的功能)、ClusterSource等。MediaObject有兩個(gè)子類(lèi)MediaSet和MediaItem。MediaSet是一個(gè)集合類(lèi),其元素是MediaItem類(lèi)型。MediaSet又有子類(lèi)LocalAlbumSet、ClusterAlbumSet、ComboAlbumSet、LocalAlbum、ClusterAlbum、ComboAlbum等。MediaItem又有子類(lèi)LocalMediaItem、UriImage等。數(shù)據(jù)模型用圖形表示就是:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68046.html
摘要:不努力不奮斗,可能就會(huì)在基層一輩子止步不前。不過(guò),只一句,如果你還在做這一行,還是一名程序猿媛,想走上坡路的你,也許我這到手的十幾家一線互聯(lián)網(wǎng)公司性能優(yōu)化項(xiàng)目實(shí)戰(zhàn)可能會(huì)對(duì)你有所幫助。 ...
閱讀 1658·2023-04-25 14:12
閱讀 1137·2021-08-27 16:24
閱讀 2571·2019-08-30 15:44
閱讀 2943·2019-08-30 13:16
閱讀 1712·2019-08-29 14:10
閱讀 1004·2019-08-29 13:54
閱讀 1338·2019-08-29 13:09
閱讀 1858·2019-08-26 18:37