天天看點

android launcher2

引用:

主要涉及3個方面,作為Launcher源碼研究的入門:

1.源碼的下載下傳;

2.源碼的編譯;

3.結構初探。

[下載下傳源碼] 

2.任一地方建立一個目錄(用于儲存下載下傳下來的源碼);

3.點選目錄右鍵,選擇Git Bash,這是會彈出一個指令輸入框;

5.按照網頁上部的提示,在指令視窗中輸入,這裡以Launcher.git為例:

  git clone git://android.git.kernel.org/platform/pakages/apps/Launcher.git

*這樣下載下傳到的是最新更新版本的代碼,如果想指定下載下傳某個版本

< 

  1.

  git clone git://android.git.kernel.org/ + project path

  2. 進入到下載下傳目錄

  cd <dir>

  3.擷取分支

  git branch

  4.關聯

  git checkout <branch_name> -b <your_branch_name>

  5.同步資料

  git pull

> 

<貌似還有點問題,了解具體操作的麻煩說聲- -!> 

6.等待下載下傳完畢。

-----------------------------------------

參考資料:

<a href="http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/">Git和Repo掃盲——如何取得Android源代碼</a>

[編譯和運作] 

準備工作: 

1. 下載下傳好的roject源碼(此處為Launcher);

2. 編譯好的Android源碼(下文給出編譯好的Launcher相關類庫的下載下傳連結)。

具體操作: 

1.将下載下傳的Project源碼導入Eclipse 

建立Android項目,選擇"Create project from existing source",并指定項目的路徑,如下圖:

android launcher2

下面的SDK你要根據你下載下傳的Project所支援的Android版本選擇,然後“finish”。

此時你會發現項目是布滿"紅叉"的:

android launcher2

接下來的任務就是去掉這些"紅叉",使項目能順利編譯。

PS:有的Project源碼可能丢失了R.java,可以通過以下方法解決:

第1種方法: 右擊工程-&gt;選擇Android Tools-&gt;選擇Fix Project Properties

第2種方法: 右擊工程-&gt;選擇Properties-&gt;選擇 Android-&gt;Apply 

2.重名包名 

為了避免與系統預設的包名沖突,是以需要進行修改。

在src/com.android.launcher上點選右鍵,"Refactor" -&gt; "Rename...",名字可以自定義(我這裡改成com.study.launcher),選項如下圖選擇(全選上):

android launcher2

點選"Preview&gt;",進行預覽(途中彈出警告的話,不用管,繼續"Countinue"),這裡要去掉一些不必要的修改,否則就會改亂了。

進入到這麼一個界面:

android launcher2

找到以下選項,去掉前面的鈎子:

android launcher2
android launcher2

點選"OK",等待處理完畢...

ps:過程中可能會彈出這樣一個錯誤提示,直接"Abort"就好: 

android launcher2

*結束後可能會彈出這樣的提示框:

android launcher2

點“Yes”。 

到此第一步操作完畢,但是你會發現"紅叉"依舊,我們接下來繼續處理...

3.導入Android類庫 

導入jar, 

這裡要注意的是,直接"Add To Library"好像有點問題,我這試了幾次都會導緻Eclipse卡着不動了...

1).建立一個User Library 

在項目上右鍵,“Build Path” -&gt; “Add Libraries...”,選擇"User Library","Next";

在彈出的新界面,點選右側的"User Libraries",彈出如下界面:

android launcher2

點選"New"建立一個名為"framework"的庫,然後點選"Add JARs..."指定到classes.jar。

2).添加User Library 

确定後,傳回如下界面,打上"framework"前面的小勾:

android launcher2

點選"finish"。

調整類庫加載次序, 

将"framework"調整到最上(項目右鍵,"Build Path"-&gt;"Configure Build Path..."):

android launcher2

點選"OK"傳回。

這時再重新整理下項目, 

"紅叉"一下子消失很多了吧,但是在Launcher.java下還有錯誤。根據情況,将裡面的幾行代碼手動注釋掉即可。

PS:如果還是很多"紅叉",你點進類裡看看,估計就是因為R.java的包引用問題,将import去掉即可(或者通過組合鍵"ctrl+shift+o"來自動修複類的引用導入)。 

*如果發現R.java沒有生成,可以試着将gen/下的目錄删了,再按上面的方式重新生成。 

!!特别注意的是:

網上有些文章介紹說,直接通過自定義變量和手動調用相應的函數來跳過編譯錯誤,該種方法并不可取!因為這些内部變量在内部可能會在某個地方被指派的(具體我無從知道),但測試結果告訴我——如果Worksapce.java裡的mScrollX和mScrollY自己來提供的話,會導緻滑屏出現問題...是以麻煩點還是搞到編譯好的jar包好。 

4.修改AndroidManifest.xml 

去掉其中的"android:sharedUserId="android.uid.shared" ":

android launcher2

5.編譯,運作 

試試編譯,通過了:

android launcher2

ps:Project源碼預設沒有指定minSDK,你可以手動設定,避免提示錯誤。 

*如果編譯出現問題,請檢視LogCat中的提示,一般能快捷地定位到問題 

打開模拟器運作看看, 

按下"HOME"鍵:

android launcher2

啟動我們自己的Launcher,和系統的一模一樣吧~~

android launcher2

OK,大功告成! 

[結構研究]

android launcher2

*詳細布局情況可以通過SDK_dir/tools/hierarchyviewer.bat進行檢視。 

整個homescreen是一個包含三個child view的FrameLayout(com.android.launcher.DragLayer)。

第一個child就是桌面com.android.launcher.Workspace。這個桌面又包含三個child。每個child就對應一個桌 面。這就是你在Android上看到的三個桌面。每個桌面上可以放置下列對象:應用快捷方式,appwidget和folder。

第二個child是一個SlidingDrawer控件,這個控件由兩個子控件組成。一個是 com.android.launcher.HandleView,就是Android桌面下方的把手,當點選這個把手時,另一個子控 件,com.android.launcher.AllAppsGridView就會彈出,這個子控件列出系統中目前安裝的所有類型為 category.launcher的Activity。

第三個child是com.android.launcher.DeleteZone。當使用者在桌面上長按一個widget時,把手位置就會出現一個垃圾桶形狀的控件,就是這個控件。

在虛拟桌面上可以擺放四種類型的對象:

1. ITEM_SHORTCUT,應用快捷方式

2. ITEM_APPWIDGET,app widget

3. ITEM_LIVE_FOLDER,檔案夾

4. ITEM_WALLPAPER,牆紙。

類簡介: 

AddAdapter:添加桌面元素的擴充卡。

AllAppsGridView:Icon清單的的主界面,繼承gridView。

DeleteZone:luancher的删除區域,繼承ImageView。

DragController:拖動控制接口。

DragLayer:整個launcher的父節點,繼承FrameLayout,實作接口DrayController。

DragSource:拖動源接口,定義了void onDropCompleted(View target, boolean success)。

DropTarget:拖動目标,定義很多拖動過程需要的方法:onDrop,onDragEnter,onDragOver,onDragExit,acceptDrop。

HandleView:launcher抽屜的開關,不過在android2.2已經沒用抽屜了。

Launcher:整個launcher的程式的入口,代碼量最大的一個檔案。

Workspace:整個界面layout,幾個視窗就是他下面的子節點。

Launcher中實作了MVC模式(M:launchermode , V:draglayer ,C: launcher),以此為主線,可以得到 Launcher對各個元件管理的細節(如drag的實作)。

繼續閱讀