一、引言
關於Android10和11系統Launcher3的定制有很多,根據項目的需求會進行各種定制開發,
於是就需要研究Launcher3的源碼。本文主要從Android 11的Launcher3QuickStep著手
(go版本或者其他版本類似)從常用的修改進行分析,首先就得大致理解 Launcher3各個
類的作用。
1.1、常用類簡述
1. BaseIconFactory.java:Launcher圖標的工廠類,控制圖標UI展示(圖標白邊控制)
Android8,9,10可能在其他類,可以全局搜索normalizeAndWrapToAdaptiveIcon方法
差不多一樣的邏輯。
2. OverviewToAllAppsTouchController.java:橫向控制抽屜式All應用界面的觸摸類。
3. PortraitStatesTouchController.java:豎向控制抽屜式All應用界面的觸摸類。
4. BubbleTextView.java:Launcher所有圖標文字顯示的父類,包括文字的大小,文字
刷新的的父類。
5. CellLayout.java:Launcher佈局的計算類,圖標的顯示邊距等,組成workspace
的view,繼承自viewgroup,既是一個dragSource又是一個dropTarget,可以將它裡面
的item拖出去,也可以容納拖動過來的item。在workspace_screen裡面定瞭一些它
的view參數。
6. SecondaryDropTarget.java:長按APP圖標的操作類,對圖標進行移動、刪除、
移除、取消、卸載等操作。
7. DeviceProfile.java:圖標大小、各個圖標間距,佈局等計算實體類,可配置各個參數
的全局變量。
8. Launcher.java: launcher主要的activity,是launcher桌面第一次啟動的activity,UI的
主要入口。
9. Workspace.java: 抽象的桌面。由N個cellLayout組成,從cellLayout更高一級的層面上
對事件的處理。
10. ClippedFolderIconLayoutRule.java: 文件夾圖標內部顯示小圖標縮略圖的計算類
,常見4宮格9宮格顯示的實現類。
11. FolderGridOrganizer.java: 展開文件夾顯示的計算邏輯類,文件夾圖標呈現是網格
狀,此類主要給文件夾各應用圖標制定顯示規則,比如3*4,4*4。
12. LoaderTask.java: 加載各個模塊Task的顯示類,如workspace工作區icon、all工作
區icon初始化工作。
13. PackageUpdatedTask.java: PMS安裝應用後更新Launcher3圖標及邏輯的實現類。
14. device_profiles.xml:默認Launcher的網格配置,主要包括一下幾點:
a. workspace的行和列;
b. 文件夾中配置的行和列;
c. 圖標大小;
d. 圖標名稱文字大小;
e. 默認選擇加載哪個網格xml的配置文件。
15. default_workspace_xxx.xml/partner_default_layout.xml:默認排序各個圖標位
置的配置文件,包括文件夾默認創建顯示及位置。
16. folder_shapes.xml:默Workspace工作區圖標的圓角大小控制配置文件。
1.2、此文涉及修改點
1. 去除抽屜功能,屏蔽上拉事件與指示UI;
2. 去除hotseat功能,包括UI的顯示與拖拉事件的修改;
3. 去除文件夾背景,以壁紙為背景;
4. 預制及安裝的應用快捷圖標默認顯示在Workspace區;
5. 制定預制應用默認快捷圖標在桌面顯示的位置(Workspace以網格形式進行擺設),
出廠默認顯示文件夾圖標及功能;
6. Workspace和ALL界面及文件夾展開界面圖標大小,間距的定制(固定大小);
7. Workspace顯示圖標名稱,字體的大小間距調整;
8. 文件夾圖標9宮格的顯示;
9. 文件夾圖標名字顯示,圖標圓角,背景透明;
10. 展開的文件夾多個分頁名稱居中,靠左顯示,窗口居中,背景圓角,圖標固定模板
網格顯示(如3*4);
11. 長按卸載APP的修改,防卸載功能控制,圖標白邊;
二、功能點闡述及修改
2.1、去除抽屜功能
Launcher3的抽屜功能其實就是手指滑動底部屏幕顯示出一個展示所有app快捷圖標入口
的界面,根據需要,如需要去除此界面及功能,有很多方式,此次介紹最簡單的方式,
就是屏蔽手指上劃事件,達到去除此功能的效果,修改如下:
1. 豎向抽屜修改點:
事件派發控制在PortraitStatesTouchController類的canInterceptTouch方法
2. 橫向抽屜修改點:
事件派發控制在OverviewToAllAppsTouchController類的canInterceptTouch方法
2.2、去除hotseat功能
hotseat功能就是底部一排應用快捷按鈕,可放置各個應用圖標及文件夾圖標,支持默認
預制應用、拖拉移除、合並成文件夾等功能,現常見的做法為移除此欄,所有圖標在
Workspace區域顯示,去除此功能修改點如下:
1. hotseat.xml佈局文件中修改width為1dp與height為0dp:
2. Hotseat.java實現類的構造方法及刷新時GONE佈局,去除工作區移動APP到
hotseat區域後圖標顯示在hotseat區域邏輯,修改點如下:
3. Launcher.java初始化控件的setupViews方法中GONE佈局:
4. LauncherPreviewRenderer.java 的MainThreadRenderer內部類中GONE佈局:
2.3、去除文件夾背景
文件夾縮率圖背景和展開文件夾背景根據系統值或者主題設置成純色的,不美觀,根據
需要可修改被壁紙默認的背景,比較美觀大方,修改點如下:
FolderAnimationManager.java 類的getAnimator方法中屏蔽背景的設置,變量
mFolderBackground設置背景,如圖:
2.4、系統預制應用顯示在Workspace工作區
Launcher3默認情況系統預制應用顯示在all工作區,Workspace區隻顯示xml配置中顯示
的幾個圖標,如需要預制應用都顯示Workspace工作區,需要做以下修改:
LoaderTask.java類中的run方法把加載的應用添加到workspace工作區
2.5、安裝的應用顯示在Workspace工作區
Launcher3默認情況安裝的應用顯示在all工作區,如需在安裝的應用在workspace工作區
顯示,需要添加新邏輯把應用添加到workspace工作區,修改如下:
1. PackageUpdatedTask.java類添加updateToWorkSpace方法,此方法實現安裝的
APP添加到workspace工作區的邏輯:
2. execute方法中添加updateToWorkSpace方法更新APP顯示到workspace工作區
2.6、應用默認顯示位置
1. device_profiles.xml文件中配置圖標顯示的矩陣(包括文件夾),圖標大小及圖標名
稱大小等配置
2.創建一個default_workspace_4x5.xml(名稱根據需求定義),在device_profiles.xml
文件中引用此xml
2.7、工作區、展開文件夾固定圖標大小及固定圖標間距
1. DeviceProfile類的updateIconSize方法修改workspace工作區圖標的大小:
iconSizePx表示圖標大小,可重新賦值;
iconTextSizePx表示圖標大小,可重新賦值;
folderIconSizePx表示文件夾圖標大小,可重新賦值;
2. DeviceProfile類的updateFolderCellSize方法修改展開文件夾圖標的小及間距:
folderChildIconSizePx表示展開文件夾內圖標大小,可重新賦值;
folderChildTextSizePx表示展開文件夾內圖標文字大小,可重新賦值;
folderCellWidthPx表示展開文件夾內圖標橫向間距,可重新賦值;
folderCellHeightPx表示展開文件夾內圖標豎向間距,可重新賦值;
3. ShortcutAndWidgetContainer類的layoutChild方法修改展開文件夾框上下邊距:
childLeft表示展開文件夾內展示的矩形框左邊距,可重新賦值;
childTop表示展開文件夾內展示的矩形框上邊距,可重新賦值;
2.8、文件夾圖標9宮格
1. ClippedFolderIconLayoutRule類實現九宮格功能
MAX_NUM_ITEMS_IN_PREVIEW變量表示顯示幾個縮略圖標,改為9
MIN_SCALE變量表示縮略圖標最小大小,改為0.22f
MAX_SCALE變量表示縮略圖標最大大小,改為0.22f(不做伸縮)
scaleForItem函數固定縮略圖標大小:
getPosition函數計算縮略圖圖標排序,對函數進行重寫:
computePreviewItemDrawingParams函數控制縮略圖圖標排序
2. FolderGridOrganizer類對isItemInPreview函數進行重寫
2.9、展開的文件夾圖標名字顯示,圖標圓角
1. 文件夾圖標名字顯示
Folder類的onFinishInflate函數修改文字參數
FolderIcon類的inflateIcon函數修改邏輯
2. 文件夾圖標圓角配置
folder_shapes.xml文件配置參數
3. 文件夾背景透明
FolderAnimationManager類的構造方法屏蔽mFolderBackground賦值
FolderAnimationManager類的getAnimator函數屏蔽mFolderBackground賦值
FolderIcon類的dispatchDraw函數屏蔽mBackground變量賦值
3.0、展開的文件夾多個知識點修改
1. 多個分頁文件夾名稱居中
FolderPagedView類的arrangeChildren函數修改邏輯
2. 靠左顯示
CellLayout類的onLayout函數修改邏輯
3. 窗口居中
Folder類的centerAboutIcon函數lp.x和lp.y變量為矩形框坐標,參數說明
720為屏幕分辨率的橫向尺寸
1600為屏幕分辨率的豎向尺寸
24為狀態欄尺寸
48為導航欄尺寸
Folder類的getContentAreaHeight函數固定矩形框高度
FolderPagedView類的getDesiredWidth函數固定矩形框寬度
4. 背景圓角
PreviewBackground類的getScaledRadius函數修改圓角大小
5. 圖標固定模板網格顯示(如3*4)
FolderGridOrganizer類對calculateGridSize函數進行從寫,屏蔽原生邏輯
此函數中添加新計算邏輯
3.1、長按卸載APP的修改,防卸載功能控制,圖標白邊
1. 長按卸載的修改
DeleteDropTarget類對setTextBasedOnDragSource函數進行修改
DeleteDropTarget類對setControlTypeBasedOnDragSource函數進行修改
DeleteDropTarget類添加isCanDrop函數,提供判斷
DeleteDropTarget類對completeDrop函數進行修改,屏蔽Snackbar.show
DeleteDropTarget類對onAccessibilityDrop函數進行修改
DragController類對drop函數進行修改
DragController類添加函數isNeedCancelDrag
2. 防卸載功能控制
SecondaryDropTarget類對supportsAccessibilityDrop函數進行修改
3. 圖標去白邊
BaseIconFactory類對normalizeAndWrapToAdaptiveIcon函數進行修改
三、總結
Launcher3的定制根據項目需求有各個點的修改,要隨心所欲對其修改還需要理解其框架,以
大的方向去看問題,角度不一樣解決問題的思路會豁然開朗。後續還有更多關於Launcher3、
原生Settings、SystemUI等系統應用以及framework端的博客,我主要做framework的開發工
作,後續以framework博客為主,涉及的平臺有rk、紫光展訊zr、全志、MTK、高通平臺。