本文來自http://blog.csdn.net/chenshaoyang0011 轉載請申明文章出處!
Android系統的一大特色是它擁有的桌面通知系統,不同於IOS的桌面管理,Android有一個桌面系統用於管理和展示APP以及桌面Widget等。Android提供一個默認的桌面應
用,當然我們也可以使用第三方的桌面應用。Android的Launcher的源碼在 \packages\apps\Launcher2。Launcher2的主佈局文件包括res\layout-land\launcher.xml
, res\layout-port\launcher.xml , res\layout-sw600dp\launcher.xml ,分別適配橫屏,豎屏和7寸平板。內容大同小異,這裏就以res\layout-port\launcher.xml的爲例。
首先讓我們看看launcher.xml中的結構:
- <com.android.launcher2.DragLayer
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:launcher="http://schemas.android.com/apk/res/com.android.launcher"
- android:id="@+id/drag_layer"
- ...
- >
- <!-- Keep these behind the workspace so that they are not visible when
- we go into AllApps -->
- <include
- android:id="@+id/dock_divider"
- layout="@layout/workspace_divider"
- ...
- />
- <!-- 分頁指示器 -->
- <include
- android:id="@+id/paged_view_indicator"
- layout="@layout/scroll_indicator"
- ...
- />
- <!-- The workspace contains 5 screens of cells -->
- <com.android.launcher2.Workspace
- android:id="@+id/workspace"
- ...
- >
- <!-- 五個分屏,默認顯示cell3 -->
- <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
- <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
- <include android:id="@+id/cell3" layout="@layout/workspace_screen" />
- <include android:id="@+id/cell4" layout="@layout/workspace_screen" />
- <include android:id="@+id/cell5" layout="@layout/workspace_screen" />
- </com.android.launcher2.Workspace>
- <!-- 搜索框/刪除框 -->
- <include
- android:id="@+id/qsb_bar"
- layout="@layout/qsb_bar" />
- <!-- 顯示具體全部應用的界面,包括APPS、WIGHETS的tab標籤,以及顯示ALL APP的頁面和現實APP WIGHETS的頁面 -->
- <include layout="@layout/apps_customize_pane"
- android:id="@+id/apps_customize_pane"
- ..
- />
- <!-- WorkSpace最下面的五個快捷位置 -->
- <include layout="@layout/hotseat"
- android:id="@+id/hotseat"
- ..
- />
- <!-- 剛啓動的時候顯示的指導頁 -->
- <include layout="@layout/workspace_cling"
- android:id="@+id/workspace_cling"
- ...
- />
- <!-- 是第一次進入全部應用之後顯示的指導頁 -->
- <include layout="@layout/folder_cling"
- android:id="@+id/folder_cling"
- ...
- />
- </com.android.launcher2.DragLayer>
接着我們來一一認識每一個View控件。
1、最外層的DragLayer,是一個繼承自FramLayout的View控件,顯示的就是整個桌面根容器。桌面的所有控件都是位於DragLayer中。
2、id/dock_divider,使用了佈局workspace_divider,其實就是一個ImageView。是Workspace與Hotseat之間的分割線。
3、id/paged_view_indicator,使用了佈局scroll_indicator,顯示效果是在id/dock_divider上顯示一條淡藍色的橫線,來指示當分屏所處的位置
4、id/workspace ,工作空間擁有五個workspace_screen,即有五個分屏,每個分屏都可以放置shortcut和AppWidget,效果如下:
5、id/cell1..cell5 ,分別代表五個分屏
6、id/qsb_bar 搜索框/刪除框,根據需要進行切換
7、id/apps_customize_pane,效果如下
8、id/hotseat 即主屏幕下方的五個快捷位置
9、id/workspace_cling當第一次運行Launcher2時,會顯示的用於指導的動畫,以後不再顯示
10、id/folder_cling,第一次使用Folder時,展示給用戶的指導畫面。
這樣,我們已經可以使每個UI界面及組件都對號入座,這會使接下來分析的時候更加清晰。
Launcher3其實最主要的是一個Activity,基本上所有的操作都集中在這個Activity上,在Launcher.java 當中,setContentView的參數是R.layout.launcher,我們暫時只研究下桌面豎屏的情況,相關源碼在res/layout-port/launcher.xml。
請左手拿着你運行着launcher3的手機,右手打開launcher.xml,佈局的最外面是一個FrameLayout,緊緊地包圍了一個叫DragLayer的ViewGroup,他繼承自FrameLayout,主要功能就是處理拖拽事件,當你在拖拽一個圖標的時候,就是一個view放到了DragLayer裏面,跟隨你的手在移動。
下面在你的手機屏幕上左右滑,有好幾屏,這個能滑的東西叫做Workspace,在佈局文件裏面可以看到的,Workspace能算是Launcher3代碼裏代碼量前三的吧,他的父類的父類是PagedView,一個用來處理左右滑動的ViewGroup。那麼Workspace裏面可以滑動的單獨一屏叫什麼呢? 佈局文件裏面似乎沒有寫,其實是CellLayout,他負責的是圖標和小部件的顯示和整齊擺放。
接下來看你在滑動屏幕的時候看見下方有個指示器,告訴你桌面現在有幾屏,當前是在哪一屏上。這個東西叫做PageIndicator,從名字就可以看出意義了。還有最下面的4個固定不動的圖標,和中間一個Button顯示所有應用,這整個叫做Hotseat,用來放置比較常用的應用,比如撥號,短信,相機等等。
屏幕最上方有個搜索框,在我們拖動圖標的時候,這個搜索框會替換成“刪除”,整個這部分叫做SearchDropTargetBar。長按桌面空白區域的時候會進入一個界面,這裏可以對屏幕進行換序操作,下面有三個按鈕“壁紙”,“小部件”和“設置”,這個在佈局文件裏的id爲overview_panel。接下來還有幾個爲cling結尾的子佈局,這些是桌面第一次啓動時候的幫助界面,告訴你怎麼點擊怎麼用。
最後哈有兩個東西我暫時還沒有搞懂,ScrimView和DrawableStateProxyView,如果有人知道的話,留個言哈~
一圖勝千言: