一、引言

关于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、高通平台。

Android10/11 原生Launcher3深度定制开发相关推荐

  1. android11 Launcher3 桌面定制开发之删除默认Google搜索框

    把 Workspace中的bindAndInitFirstWorkspaceScreen方法: 按照下面修改即可: /*** Initializes and binds the first page* ...

  2. 地面站定制开发无人机教程分享

    说到国外市场,无人机市场堪称火爆,究其原因,是由于 Mission Planner的多功能性,全方位涵盖了调试.飞行.模拟等各种功能,但福祸相倚,Mission Planner功能多同样造成了使用上的 ...

  3. 无人机地面站定制开发流程分享

    说到国外市场,无人机市场堪称火爆,究其原因,是由于 Mission Planner的多功能性,全方位涵盖了调试.飞行.模拟等各种功能,但福祸相倚,Mission Planner功能多同样造成了使用上的 ...

  4. android 圆角边框边框渐变,Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout...

    Android深度定制化TabLayout:圆角,渐变色,背景边框,圆角渐变下划线,基于Android原生TabLayout 在附录1的基础上丰富自定义的TabLayout,这次增加两个内容: 1,当 ...

  5. 基于android p深度定制的miui,Redmi K30 Pro推送MIUI 12.2.1稳定版:基于Android 11深度定制...

    今日,Redmi K30 Pro 推送了 MIUI 12.2.1 稳定版内测更新.新系统基于 Android 11 深度定制,更新了 2020 年 10 月谷歌安全补丁.需要注意的是,本次更新为安卓跨 ...

  6. 红米4A Android 版本,红米4A评测:4A搭载深度定制基于Android6.0.1系统MIUI 8 - 红米4A评测:双11手机单品销量第一 怎么样好不好用?...

    标签: 系统方面,红米4A搭载了小米今年刚推出的MIUI 8,这是基于Android 6.0.1深度定制的ROM.内置的默认主题风格很有小米的味道,非常简洁. 手机主界面 默认锁屏的界面下,底部左侧右 ...

  7. 面向隐私AI的TensorFlow深度定制化实践

    作者 | Rosetta团队 出品 | AI科技大本营(ID:rgznai100) 之前我们整体上介绍了基于深度学习框架开发隐私 AI 框架中的工程挑战和可行解决方案.在这一篇文章中,我们进一步结合 ...

  8. android 深度定制,深度定制安卓是什么

    深度定制安卓系统是指以android源码为基础,以产品特性为目的而进行深度改造的系统.市面上最常见的深度定制系统是中国移动OPhone所采用的OMS系统.深度定制不只是对UI进行的重新设计,还会围绕硬 ...

  9. 降低深度学习开发门槛,“动态图+高层API”能带来多大的便利?

    "在深度学习技术面前,我感觉到深深的危机感." 已经有无数人曾经吐槽过这一点,因为深度学习趋势不可阻挡,但其入门门槛之高,落地难度之大,又往往会把开发者挡于门外. 如何降低深度学习 ...

最新文章

  1. Tricky Sum
  2. 爸爸我爱您(之十二)
  3. 周志華《機器學習》圖4.4和图4.9繪制(轉載+增加熵顯示功能)
  4. 手机知识:手机快充取决于充电头还是数据线,看完你就懂了!
  5. linux之wget和curl如何携带cookie进行链接访问
  6. 第二十期:黄金三步法 | 汇报时,如何让老板快速抓住重点?
  7. 中科大在50年代的教学理念
  8. 鬼子进村(洛谷 1503)
  9. Linux 命令(79)—— pidof 命令
  10. IT之路,从迷茫“愤青”到团队项目经理,他是如何一步步走出来的?
  11. 通过hx1838遥控数码管显示对应数字的程序及问题
  12. Java生成二维码图片并打包下载
  13. 计算机科学与技术影视,计算机科学与技术专业--水墨的影视艺术语言的研究
  14. 网络上公开的华为一面、二面、三面、四面、五面过程的总结
  15. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp
  16. distinct返回null报错_distinct
  17. 11.Django基础九之中间件
  18. ubuntu wps缺少字体_一个字体:系统风汜霰汜源圆
  19. Linux下创建超级用户
  20. OpenCv设置摄像头参数/获得摄像头参数值

热门文章

  1. 华为云数据转发与分析
  2. 展览活动项目管理的五个要素
  3. 保研联系导师邮件模板
  4. python进阶——AI视觉实现口罩检测实时语音报警系统
  5. #芯片# N25Q128A21BSF40F
  6. 通信手机术语:什么是IMEI IMEI串号组成
  7. 美版有锁iphone4怎么突然连不上网了
  8. word2003,使用修订模式
  9. hbase基于solr配置二级索引
  10. Terraform基础(一)-什么是Terraform?