文件類别
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的定義等)的類型定義。
解決方式
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,如果有的話保留,沒有的話則删除最後一屏,以此類推。
xml文件
1.workspace_screen.xml
launcher:cellWidth="95dip"cell(即item)的寬
launcher:cellHeight="93dip"cell(即item)的寬
launcher:longAxisStartPadding="25dip"
較長(屏幕的寬和高中較大的那一方向,根據橫豎屏方向有所不同)方向上距離起點的像素數
launcher:longAxisEndPadding="55dip"
較長(屏幕的寬和高中較大的那一方向,根據橫豎屏方向有所不同)方向上距離終點的像素數
launcher:shortAxisStartPadding="20dip"
較短(屏幕的寬和高中較大的那一方向,根據橫豎屏方向有所不同)方向上距離起點的像素數
launcher:shortAxisEndPadding="120dip"
較短(屏幕的寬和高中較大的那一方向,根據橫豎屏方向有所不同)方向上距離起點的像素數
launcher:shortAxisCells="3"
較短的方向上可以容納的cell的數量
launcher:longAxisCells="5"
較長的方向上可以容納的cell的數量
shortAxisCells和longAxisCells決定一個workspace(即CellLayout)上可以容納的item的個數為shortAxisCells*longAxisCells.
2.application_boxed.xml
所有應用程序和系統文件夾中item的定義。
3.application.xml
Workspace的item的layout定義。