Android Launcher分析和修改1——Launcher預設介面配置(default_workspace)

來源:互聯網
上載者:User

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

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

    今天主要是分析修改Launcher的預設介面如何配置和修改。Launcher修改是最近才開始,下面兩張圖片是最近修改後的結果。因為程式是用於車載導航儀的,所以介面和一般的手機介面差別較大。改動也比較大,不過對於Launcher的分析修改都是通用的。

這是基於Android4.0.3修改後的Launcher介面,因為程式是用在汽車導航上,所以表徵圖做了放大操作。刪除了一些不需要的東西。

下面針對介面修改的地方做分析。

 

1、介面預設設定檔

    機器剛升級的時候,Launcher的介面是預設讀取一個xml設定檔,完成配置工作。這個設定檔在Launcher目錄下,

路徑是:\Launcher\res\xml\default_workspace.xml 。這個XML檔案就是剛升級,Launcher第一次顯示的時候,會讀取的設定檔。

default_workspace。xml裡面可以配置APP捷徑、Widget、Search搜尋欄等。下面就常用的這幾個屬性進行解析:

 


//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方法。

 

2、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捷徑表徵圖,修改表徵圖大小和行列數,以及如何配置預設背景,明天再寫另外文章說明。

如果有朋友發現哪裡寫錯了,請留言指出,謝謝!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.