Android開發中簡單的launcher概念及使用方法介紹

Android開發中簡單的launcher概念及使用方法介紹。

一、launcher的主要文件和類

1.Launcher.java:launcher中主要的activity。

2.DragLayer.java:launcher layout的rootview。DragLayer實際上也是一個抽象的界面,用來處理拖動和對事件進行初步處理然後按情況分發下去,角色是一個controller。它首先用onInterceptTouchEvent(MotionEvent)來攔截所有的touch事件,如果是長按item拖動的話不把事件傳下去,直接交由onTouchEvent()處理,這樣就可以實現item的移動瞭,如果不是拖動item的話就把事件傳到目標view,交有目標view的事件處理函數做相應處理。如果有要對事件的特殊需求的話可以修改onInterceptTouchEvent(MotionEvent)來實現所需要的功能。

3. DragController.java:為Drag定義的一個接口。包含一個接口,兩個方法和兩個靜態常量。接口為DragListener(包含onDragStart(),onDragEnd()兩個函數),onDragStart()是在剛開始拖動的時候被調用,onDragEnd()是在拖動完成時被調用。在launcher中典型的應用是DeleteZone,在長按拖動item時調用onDragStart()顯示,在拖動結束的時候onDragEnd()隱藏。兩個函數包括startDrag()和setDragItemInfo().startDrag()用於在拖動是傳遞要拖動的item的信息以及拖動的方式,setDragItemInfo()用於傳遞item的參數信息(包括位置以及大小)。兩個常量為DRAG_ACTION_MOVE,DRAG_ACTION_COPY來標識拖動的方式,DRAG_ACTION_MOVE為移動,表示在拖動的時候需要刪除原來的item,DRAG_ACTION_COPY為復制型的拖動,表示保留被拖動的item。

4.LauncherModel.java:輔助的文件。裡面有許多封裝的對數據庫的操作。包含幾個線程,其中最主要的是ApplicationsLoader和DesktopItemsLoader。ApplicationsLoader在加載所有應用程序時使用,DesktopItemsLoader在加載workspace的時候使用。其他的函數就是對數據庫的封裝,比如在刪除,替換,添加程序的時候做更新數據庫和UI的工作。

5.Workspace.java:抽象的桌面。由N個celllayout組成,從cellLayout更高一級的層面上對事件的處理。

6.LauncherProvider.java:launcher的數據庫,裡面存儲瞭桌面的item的信息。在創建數據庫的時候會loadFavorites(db)方法,loadFavorites()會解析xml目錄下的default_workspace.xml文件,把其中的內容讀出來寫到數據庫中,這樣就做到瞭桌面的預制。

7.CellLayout.java:組成workspace的view,繼承自viewgroup,既是一個dragSource,又是一個dropTarget,可以將它裡面的item拖出去,也可以容納拖動過來的item。在workspace_screen裡面定瞭一些它的view參數。

8.ItemInfo.java:對item的抽象,所有類型item的父類,item包含的屬性有id(標識item的id),cellX(在橫向位置上的位置,從0開始),cellY(在縱向位置上的位置,從0開始),spanX(在橫向位置上所占的單位格),spanY(在縱向位置上所占的單位格),screen(在workspace的第幾屏,從0開始),itemType(item的類型,有widget,search,application等),container(item所在的)。

9.UserFolder.java:用戶創建的文件夾。可以將item拖進文件夾,單擊時打開文件夾,長按文件夾上面標題處可以重命名文件夾。

10.LiveFolder.java:系統自帶的文件夾。從系統中創建出的如聯系人的文件夾等。

11.DeleteZone:刪除框。在平時是出於隱藏狀態,在將item長按拖動的時候會顯示出來,如果將item拖動到刪除框位置時會刪除item。DeleteZone實現瞭DropTarget和DragListener兩個接口。

12.LauncherSettings.java:字符串的定義。數據庫項的字符串定義,另外在這裡定義瞭container的類型,還有itemType的定義,除此還有一些特殊的widget(如search,clock的定義等)的類型定義。
補充Launcher工程中的類:

二、launcher的幾種問題的解決方式

1.將所有的應用都排列在桌面上
將所有的應用都排列在桌面是通過首先創建一個三維的boolean型全局數組來記錄item的排列情況,第一維是屏數,第二維是縱向上的排列情況,第三維是橫向的排列情況,如果那個位置被item所占用就標記為1,否則標記為0.在啟動時把全局數組初始化為0,然後在添加的時候把相應的位置置1.凡是涉及到workspace上item的變化,比如移動、添加、刪除操作時都需要維護數組,保持數組的正確性,因為在安裝新程序時依據數組的狀態去判斷把item加到什麼位置。

2.動態增加屏幕
動態增加屏幕是通過worksapce .addchild(view)的方式實現。基本思路是:首先預先規定所允許的最大的屏幕數,然後在需要增加屏幕而且當前屏幕數沒有超過最大屏幕數的時候通過(CellLayout)mInflater.inflate(R.layout.workspace_screen,null)創建一個celllayout實例出來,然後通過addchild把它加入進去。在屏幕上的item被刪除時通過從最後一屏起判斷屏幕上是否有item,如果有的話保留,沒有的話則刪除最後一屏,以此類推。

3.預制桌面
a.添加普通的應用程序快捷方式:
在../res/xml下的default_workspace.xml文件中加入默認要放置的普通的應用程序。加入的格式為:
<favorite
launcher:packageName=… //應用的packageName
launcher:className=… //應用啟動時的第一個activity
launcher:screen=… //放置在第幾屏(放在workspace的時候需要,從0開始,0為第一屏,1為第二屏,以此類推…)
launcher:x=… //放置x方向的位置(在列中的位置)
launcher:y=… /> //放置y方向的位置(在行中的位置)
packageName和className可以通過點擊程序,然後在打印出的log中找到comp={…},例如如下信息:
comp={com.estrongs.android.taskmanager/com.estrongs.android.taskmanager.TaskManager}。其中com.estrongs.android.taskmanager為packageName,com.estrongs.android.taskmanager.TaskManager為className。
workspace的佈局如下: (0,0) (1,0) (2,0) (3,0) (4,0) (0,1) (1,1) (2,1) (3,1) (4,1) (0,2) (1,2) (2,2) (3,2) (4,2) b.添加widget:
在../package/apps/VLauncher/res/xml下的default_workspace.xml文件中加入默認要放置的普通的應用程序。加入的格式為:
<widget
launcher:packageName=…//widget的packageName
launcher:className= …//實現 widget的 receiver 類的名稱.
launcher:container=…//放置的位置(隻能為desktop)
launcher:screen=…//放置在第幾屏上
launcher:x=…//放置的x位置
launcher:y=…//放置的y位置
launcher:spanx=…//在x方向上所占格數
launcher:spany=…/> //在y方向上所占格數
例如,要在第3屏的第一行第二列放置開始放置一個x方向上占兩個單位格,y方向上占兩個單位格的時鐘,可以加入以下代碼:
launcher:packageName=com.android.alarmclocklauncher:className=com.android.alarmclock.AnalogAppWidgetProvider
launcher:container=desktop
launcher:screen=2
launcher:x=1
launcher:y=0
launcher:spanx=2
launcher:spany=2/></appwidget
</widget
</favorite

4.改變主界面的排列方式
要修改桌面的排列方式,如下,先根據橫豎屏設置修改workspace_screen.xml裡shortAxisCells和longAxisCells的參數,然後在Launcher.java中修改NUMBER_CELLS_X和NUMBER_CELLS_Y的值,在2.3版本中剛開始往數據庫中添加item的時候會去判斷,如果不修改NUMBER_CELLS_X和NUMBER_CELLS_Y的話會導致一部分的item顯示不出來,導致預制apk的失敗。

5.增加worksapce上的屏數
要增加屏數,首先在根據橫豎屏在launcher.xml中的;,然後在Launcher.java中修改SCREEN_COUNT的值即可。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *