Android1011 原生Launcher3深度定制开发

一、引言关于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
【Android1011 原生Launcher3深度定制开发】
2. 防卸载功能控制
SecondaryDropTarget类对supportsAccessibilityDrop函数进行修改
??????????????? ?????
3. 图标去白边
BaseIconFactory类对normalizeAndWrapToAdaptiveIcon函数进行修改
三、总结Launcher3的定制根据项目需求有各个点的修改 , 要随心所欲对其修改还需要理解其框架 , 以
大的方向去看问题 , 角度不一样解决问题的思路会豁然开朗 。后续还有更多关于Launcher3、
原生Settings、SystemUI等系统应用以及framework端的博客 , 我主要做framework的开发工
作 , 后续以framework博客为主 , 涉及的平台有rk、紫光展讯zr、全志、MTK、高通平台 。