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