Android 4.0 ICS SystemUI淺析——StatusBar結構分析

  1.佈局概覽

      首先,我們通過hierarchyviewer這個工具來查看一下系統啟動後的佈局情況(註:hierarchyviewer在SDK/tools目錄下,在windows環境下直接運行hierarchyviewer.bat,linux環境下終端執行./hierarchyviewer;安裝ADT插件後也可以通過Eclipse調用hierarchyviewer來查看)。如圖1.1:

 
 

圖 1.1

這裡簡單的介紹一下當前界面的組件,該界面為模擬器啟動後解鎖界面。其中包含瞭7個組件,從上到下依次為RecentsPanel、SatusBar、StatusBarExpanded、TrackingView、Keyguard、com.android.launcher/com.android.launcher2.Launcher、com.android.systemui.ImageWallpaper。

       RecentsPanel:指的是我們長按Home鍵彈出的“最近運行程序”。如圖1.2:

 

圖 1.2

       SatusBar:這就是我們的主角——狀態欄。由於是剛啟動,因此沒有運行任何有通知的應用程序,如下圖1.3:

 

圖 1.3

        StatusBarExpanded:根據字面意思其實我們已經知道瞭,這實際上就是通知欄下拉時候的擴展界面。如圖1.4:

 
 

圖 1.4

註:因為模擬器實際上無法顯示出USB當前連接狀態,因此這裡換用真機截圖。

       TrackingView:指的是我們將通知欄下拉以後,除開StatusBarExpanded以外的地方。如圖1.5:

 
 

圖 1.5

           Keyguard:這就是屏幕鎖,因為目前已經解鎖,因此看不到任何佈局。

        com.android.launcher/com.android.launcher2.Launcher:就是我們的Launcher,如圖1.6:

 

圖 1.6

         com.android.systemui.ImageWallpaper:也就是壁紙,是由SystemUI裡的ImageWallpaper來設置的。

       2.StatusBar之庖丁解牛

       根據前面的整體描述,相信大傢已經對Android 4.0的界面有瞭一個整體的概念,那麼接下來就切入正題——StatusBar的結構分析。對於StatusBar的分析從以下兩方面入手:首先,從界面上分析。通過hierarchyviewer來觀察StatusBar的佈局結構;其次,通過代碼分析各個組件的具體實現(註:本文主要從界面進行結構分析)。

       以為後面我將會用真機進行演示,因此這裡貼出真機的StatusBar結構圖以及原生的StatuBar結構圖,以進行對比。真機采用的是高通雙卡平臺,在原生基礎上進行的修改,原生StatusBar的結構如圖2.1,真機StatusBar結構如圖2.2:

 
 

圖 2.1

 
 

圖 2.2(看不清楚的朋友可以點這裡下載全部圖片)

          圖2.1和2.2中清晰的列出瞭StatusBar的結構組成,StatusBar實際上是由PhoneStatusBarView構成,而PhoneStatusBarView又細分成兩個大模塊,分別是icons和ticker兩個佈局。我們知道,在通常情況下,系統左邊放置通知圖標(notificationIcons),中間放置狀態圖標(statusIcons)以及信號圖標(signal_battery_cluster),右邊放置日期(clock),ticker默認是看不見的,因此實際上我們真正看到的StatusBar是icons的佈局。下面我們分別介紹這些獨立模塊的結構。

        我將StatusBar的組成部件(notificationIcons、statusIcons、signal_battery_cluster、clock、ticker)分別使用瞭不同的背景,這樣就能清晰直觀的看到各個佈局之間的關系瞭(註:我使用的是高通的雙卡平臺)。如圖2.3和2.4:

 
 

圖 2.3

 
 

圖 2.4

在圖2.3和圖2.4中,各個顏色代表的含義如下:

紅色:notificationIcons,通知圖標,比如我們常見的360以及QQ等等,都會在這裡顯示自己的圖標;

紫色:statusIcons,狀態圖標,這裡會放置系統的一些狀態圖標,比如像藍牙、鬧鐘、耳機插入等等;

綠色:signal_battery_cluster,信號以及電量圖標,這裡主要放置瞭wifi以及手機信號和電池電量的圖標(註:沒有插入SIM卡);

黃色:clock,時鐘圖標;

藍色:ticker,通知信息圖標,當系統接收到通知後,有的通知具有通知信息,因此會通過ticker進行顯示,比如禁用360的懸浮窗,插拔SD卡等等;

        再次祭出我們的hierarchyviewer,查看每個部分的組成結構。

        notificationIcons的佈局如圖2.5:

 
 

圖 2.5

           這裡和Android 4.0原生有一點點區別,因為這裡有一些類似於Android 2.3的改動,但整體上是差不多的。4個StatusBarIconView對應圖中的4個圖標,通過IconMerger也就是nocificationIcons進行整合並顯示。

       statusIcons的佈局如圖2.6所示:

 

圖 2.6

          從圖2.6我們可以知道,statusIcons是一個包含瞭8個StatusBarIconView的LinearLayout,每個StatusBarIconView存放不同的系統Icon,像這裡的藍牙、耳機插入、鬧鐘等等。

       signal_battery_cluster的佈局如圖2.7所示:

 
 

圖 2.7

          從圖2.7我們可以看到,這塊是結構比較復雜的一塊,因為與原生Android 4.0相比,高通使用瞭雙卡,所以這裡稍作瞭修改。

       clock的佈局如圖2.8所示:

 
 

圖 2.8

         我們這裡隻看瞭一個Clock的佈局,實際上Clock繼承自TextView,後續在代碼分析的時候會提到。

       最後讓我們看看ticker的佈局結構,如圖2.9:

 
 

圖 2.9

          圖2.9中可以看到,ticker由TickerView和ImageSwitcher組成,而ImageSwitcher由兩個自定義的ImageView構成,TickerView實際上就是兩個TextView的組合。

       3.StatusBar結構分析小結

       Android 4.0的StatusBar相對於Android 2.3的改動還是比較大的,對於StatusBar的分析,有利於對StatusBar的個性化定制,詳細瞭解各個模塊的功能可以對Android系統有更加深入的認識。針對本次結構分析,更加熟悉瞭hierarchyviewer的使用,對於整個SystemUI中的StatusBar也有個更加深入的認知。

 作者:yihongyuelan
 

發佈留言