Android Launcher分析和修改1——Launcher默認界面配置(default_workspace)

最近工做都在修改Launcher,因此打算把分析源碼和修改源碼的過程記錄下來,最近會寫一些關於Launcher的分析和修改博文。由於我是修改4.0.3的Launcher,因此後面文章裏面的Launcher都是基於Android4.0.3的Launcher2修改。Launcher源碼比較多,並且裏面應用了不少設計模式,要把它分析清楚要花很多精力,網上也有一些零碎的分析文章,不過關於修改的文章很少。因此打算寫一些分析和修改Launcher結合的文章。html

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3153880.htmljava

    今天主要是分析修改Launcher的默認界面如何配置和修改。Launcher修改是最近纔開始,下面兩張圖片是最近修改後的結果。由於程序是用於車載導航儀的,因此界面和通常的手機界面差異較大。改動也比較大,不過對於Launcher的分析修改都是通用的。數據庫

這是基於Android4.0.3修改後的Launcher界面,由於程序是用在汽車導航上,因此圖標作了放大操做。刪除了一些不須要的東西。設計模式

下面針對界面修改的地方作分析。api

 

一、界面默認配置文件app

    機器剛升級的時候,Launcher的界面是默認讀取一個xml配置文件,完成配置工做。這個配置文件在Launcher目錄下,ide

路徑是:\Launcher\res\xml\default_workspace.xml 。這個XML文件就是剛升級,Launcher第一次顯示的時候,會讀取的配置文件。函數

default_workspace。xml裏面能夠配置APP快捷方式、Widget、Search搜索欄等。下面就經常使用的這幾個屬性進行解析:spa

 

 
 
//Edited by mythou
//http://www.cnblogs.com/mythou/
快捷方式說明 <favorite                                  //程序快捷鍵屬性標籤
    launcher:className="com.apical.radio.radioMainActivity"     //該應用的類,點擊圖標時,須要啓動的類
    launcher:packageName="com.apical.radio"                  //該應用的包名
    launcher:screen="1"                             //第1屏,0-4屏共5屏
    launcher:x="0"                                   //圖標X位置,左上角第一個爲0,向右遞增,0-4共5個
    l0auncher:y="0"                               //圖標Y位置,左上角第一個爲0,向下遞增,0-2共3個
/>

    Launcher默認是有5個分屏,不過這個能夠配置。一樣,每行每列有多少圖標也是能夠配置的,這個在後面會說在哪裏能夠修改。這裏按我修改的是3行5列的界面排布(對應上面的效果圖)。通常配置APP的快捷方式,使用上面的屬性標籤就能夠。插件

 

//Edited by mythou
//http://www.cnblogs.com/mythou/
//桌面Widget的標籤
<appwidget                                  //插件
    launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider"  //該應用的類
    launcher:packageName="de.dnsproject.clock_widget_main"                 //該應用的包名
    launcher:screen="1"                               //第1屏,0-4屏共5屏
    launcher:x="2"                                      //圖標X位置,左上角第一個爲0,向左遞增,0-4共5個
    launcher:y="1"                                                 //圖標Y位置,左上角第一個爲0,向下遞增,0-2共3個
    launcher:spanX="3"                                             //在x方向上所佔格數
    launcher:spanY="2" />                                          //在y方向上所佔格數

     桌面Widget跟桌面快捷方式屬性類型,不過這裏須要注意launcher:spanX和launcher:spanY 這兩個屬性是說明Widget多大的,這個和Widget的最小寬高配置有關。咱們在編寫桌面Widget的時候,須要在XML配置文件裏面指定Widget最小的寬和高,通常最小寬高計算公式是(minWidth = 72*佔用格數-2) 計算出來,最小高度也是同樣。(上面那個模擬時鐘是MIUI的時鐘)

    minWidth = 72*佔用格數-2裏面的佔用格數就是上面launcher:spanX和launcher:spanY配置的數目。針對上面的效果圖,就是佔用了3個橫向的格子,2個豎向的格子。minWidth應該等於214。

 

<search                       //搜索欄
launcher:screen="1"               //第2屏
launcher:x="0"                    //圖標X位置
launcher:y="1"/>                  //圖標Y位置

這個是搜索欄的配置,由於我這裏不須要用到搜索欄,因此把它去掉了,若是須要配置可使用上面的屬性標籤。

 

 

至於文件夾,在4.0的Launcher裏面是支持的,分析加載函數裏面,能夠找到解析文件夾標籤的方法。

上面界面默認配置就是經過使用上面的標籤修改default_workspace.xml配置的。

下面列出default_workspace支持的標籤和屬性:

 
 
//Edited by mythou
//http://www.cnblogs.com/mythou/
//default_workspace.xml中,支持的標籤有: favorite:應用程序快捷方式。 shortcut:連接,如網址,本地磁盤路徑等。 search:搜索框。 clock:桌面上的鐘表Widget //支持的屬性有: launcher:title:圖標下面的文字,目前只支持引用,不能直接書寫字符串; launcher:icon:圖標引用; launcher:uri:連接地址,連接網址用的,使用shortcut標籤就能夠定義一個超連接,打開某個網址。 launcher:packageName:應用程序的包名; launcher:className:應用程序的啓動類名; launcher:screen:圖標所在的屏幕編號; launcher:x:圖標在橫向排列上的序號; launcher:y:圖標在縱向排列上的序號;

Launcher裏面負責解析default_workspace.xml文件的方法是 LauncherProvider.java裏面的loadFavorites方法。

 

二、LauncherProvider.java的loadFavorites分析:

//Edited by mythou
//http://www.cnblogs.com/mythou/
//傳入default_workspace文件的資源ID和數據庫實力,把xml裏面數據解析,保存到Launcher數據庫。返回總共解析了多少個標籤。

private int loadFavorites(SQLiteDatabase db, int workspaceResourceId) {
         //.........
int type; while (((type = parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT)
         {
if (type != XmlPullParser.START_TAG) { continue; } boolean added = false; final String name = parser.getName(); TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.Favorite); long container = LauncherSettings.Favorites.CONTAINER_DESKTOP; if (a.hasValue(R.styleable.Favorite_container)) { container = Long.valueOf(a.getString(R.styleable.Favorite_container)); } String screen = a.getString(R.styleable.Favorite_screen); String x = a.getString(R.styleable.Favorite_x); String y = a.getString(R.styleable.Favorite_y); // If we are adding to the hotseat, the screen is used as the position in the // hotseat. This screen can't be at position 0 because AllApps is in the // zeroth position. if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT && Integer.valueOf(screen) == allAppsButtonRank) { throw new RuntimeException("Invalid screen position for hotseat item"); } values.clear(); values.put(LauncherSettings.Favorites.CONTAINER, container); values.put(LauncherSettings.Favorites.SCREEN, screen); values.put(LauncherSettings.Favorites.CELLX, x); values.put(LauncherSettings.Favorites.CELLY, y);
            //解析xml裏面的標籤,從這裏能夠找到支持的標籤類型和相關屬性參數。
if (TAG_FAVORITE.equals(name)) { long id = addAppShortcut(db, values, a, packageManager, intent); added = id >= 0; } else if (TAG_SEARCH.equals(name)) { added = addSearchWidget(db, values); } else if (TAG_CLOCK.equals(name)) { added = addClockWidget(db, values); } else if (TAG_APPWIDGET.equals(name)) { added = addAppWidget(parser, attrs, type, db, values, a, packageManager); } else if (TAG_SHORTCUT.equals(name)) { long id = addUriShortcut(db, values, a); added = id >= 0; } else if (TAG_FOLDER.equals(name))
            {             //.........
              
              //folder屬性裏面的參數要多於2個,才能造成文件夾。
if (folderItems.size() < 2 && folderId >= 0) { // We just delete the folder and any items that made it deleteId(db, folderId); if (folderItems.size() > 0) { deleteId(db, folderItems.get(0)); } added = false; } } if (added) i++; a.recycle(); }
        //.........
return i; }

其實就是一個分析XML和寫入數據庫的過程,LauncherProvider.java是整個Launcher的數據來源,十分重要,後面我再具體分析數據加載和適配顯示方面的邏輯。

另外還有一個問題補充一下,就是有關Android截圖問題,由於我開發的機器不能使用USB調試,並且沒有搖動之類的傳感器,不少手機上截圖方法都用不了,查了一下,可使用screencap命令來截圖,具體方法能夠參考我另一篇文章:http://www.cnblogs.com/mythou/p/3152627.html

 

至於圖標加入默認背景或者強制轉換APP快捷方式圖標,修改圖標大小和行列數,以及如何配置默認背景,明天再寫另外文章說明。

若是有朋友發現哪裏寫錯了,請留言指出,謝謝!

相關文章
相關標籤/搜索