Android10/11 原生Launcher3深度定制

news2024/11/18 21:29:31

一、引言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文阅读] DAE-GCN: Identifying Disease-Related Features for Disease Prediction

[论文地址] [代码] [MICCAI 21] Abstract 学习与疾病相关的表征在基于图像的癌症诊断中起着至关重要的作用,因为它具有可信、可解释和良好的概括能力。一个好的表征不仅应该与疾病无关的特征相分离,而且还应该包含病变的属性信息(如形状、边…

【博客616】prometheus staleness对PromQL查询的影响

prometheus staleness对PromQL查询的影响 1、prometheus staleness 官方文档的解释: 概括: 运行查询时,将独立于实际的当前时间序列数据选择采样数据的时间戳。这主要是为了支持聚合(sum、avg 等)等情况&#xff0c…

【ChatGpt】——不一样的使用感受分享

作者:狮子也疯狂 专栏:《基础知识查漏》 坚持做好每一步,幸运之神自然会降临在你的身上 目录一. 🦁 前言二. 🦁 使用详情Ⅰ. 🐇 使用过程Ⅱ. 🐇 使用感受Ⅲ. 🐇 遇到的问题3.1 我遇…

linux服务器挂载硬盘/磁盘

1. 查看机器所挂硬盘个数及分区情况:fdisk -l可以看出来目前/dev/vda 目前有300G可用.内部有两个分区(/dev/vda1,/dev/vda2)。2. 格式化磁盘格式化磁盘命令为【mkfs.磁盘类型格式 目录路径组成】查看磁盘文件格式:df -T格式化磁盘…

SharkTeam:Move合约开发与合约安全

近期,围绕 Aptos 和 Sui,新兴的高性能 L1链 以及这些新链背后的 Move 智能合约编程语言引起了很多关注,社区也非常活跃,很多开发者和项目已经开始积极转向 Move。但Move相对Solidity差别较大,即使是相对比较接近的Rust…

数据与C(字符串)

目录 一.概念引入 二.字符串(数组存储,必须以\0结尾) 三.错误示范 四.strlen()和sizeof()相对于字符串的不同 一.概念引入 “a”,a哪个是字符哪个又是字符串,嘿嘿不用猜了 我们在上一章中说过&#x…

服务端开发Java面试复盘篇1

上周投了一些简历,约了8-9家面试,其中完成了3家的第一轮面试,由于面试的是Java 的实习生,感觉问的题目都比较基础,不过有些问题回答的不是很好,在这里对回答的不太好的题目做一下总结和复盘。 目录 一、后…

【数据库】 mysql用户授权详解

目录 MySQL用户授权 一,密码策略 1,查看临时密码 2,查看数据库当前密码策略: 二, 用户授权和撤销授权 1、创建用户 2,删除用户 3,授权和回收权限 MySQL用户授权 一,密码策略…

Https 协议超强讲解(一)

都说Https协议非常安全,那为什么还是会被抓包呢?抓包后会影响什么吗? HTTPS协议 随着 HTTPS 建站的成本下降,现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全,也听说过与 HTTPS 协议相关…

ChatGPT vscode中文插件

方式一和方式二只需要做一个就行 方式一:直接购买账号,购买渠道请自行寻找。 快捷键打开命令面板(ctrlshiftp 或者 commandshiftp) 输入 ChatGPT 然后选择 ChatGPT: 切换成国内/国外模式(将会重启VSCode) 命令来切换到国外模式此时会弹出一个输入框&am…

12.hadoop系列之MapReduce分区实践

本文我们学习MapReduce默认分区以及自定义分区实践 当我们要求将统计结果按照条件输出到不同文件(分区)&#xff0c;比如按照统计结果将手机归属地不同省份输出到不同文件中(分区) 1.默认Partitioner分区 public class HashPartitioner<K, V> extends Partitioner<…

ChatGPT已接入微软必应Bing搜索?如何进入新必应候补名单抢先体验

文章目录1. 前提2. 开始申请3. 直接使用ChatGPT1. 前提 Edge浏览器微软账号科学上网工具 2. 开始申请 进入新必应网址&#xff1a;https://www.bing.com/new&#xff0c;点击加入等待列表。 此时会弹出微软的登录界面&#xff0c;登录自己的微软账号即可&#xff0c;建议使用…

【C++/QT】QT5.6解析Excel教程(qtxlsx)

这里写目录标题【背景】【下载qtxlsx】【安装perl】【编译qtxlsx】【添加模块】【使用qtxlsx】【背景】 新接触QT&#xff0c;很多东西都不会&#xff0c;刚接触一个解析Excel的demo&#xff0c;记录一下安装、编译、解析Excel的过程 【下载qtxlsx】 在解析之前&#xff0c;…

多传感器融合定位十-基于滤波的融合方法Ⅰ其二

多传感器融合定位十-基于滤波的融合方法Ⅰ其二3. 滤波器基本原理3.1 状态估计模型3.2 贝叶斯滤波3.3 卡尔曼滤波(KF)推导3.4 扩展卡尔曼滤波(EKF)推导3.5 迭代扩展卡尔曼滤波(IEKF)推导4. 基于滤波器的融合4.1 状态方程4.2 观测方程4.3 构建滤波器4.4 Kalman 滤波实际使用流程4…

【Python学习笔记】25.Python3 输入和输出(1)

前言 在前面几个章节中&#xff0c;我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用…

Linux手工创建新用户

准备工作&#xff08;配置流程的理解&#xff09; Linux中useradd命令即一系列文件操作的结合体&#xff0c;所以我们可以通过查看useradd命令来确认我们手工创建新用户需要完成的文件配置 找到man useradd中涉及的文件部分 对于手工创建用户有用的文件&#xff1a; /etc/pas…

jvm学习的核心(五)---垃圾回收算法和常见垃圾回收器

文章目录1.垃圾回收算法**1.1. 标记阶段****1.2. 清除阶段**1.2.1.标记清除算法1.2.2.标记复制算法1.2.3.标记整理算法1.3.引用2.常见的垃圾回收器2.1.Serial回收器2.2.ParNew回收器2.3.Parallel回收器2.4.CMS回收器<font color red>2.5.G1垃圾回收器ZGC回收器&#xff…

2月面经:真可惜...拿了小米的offer,字节却惨挂在三面

我是2月份参加字节跳动和华为的面试的&#xff0c;虽然我只拿下了小米的offer&#xff0c;但是我自己也满足了&#xff0c;想把经验分享出来&#xff0c;进而帮助更多跟我一样想进大厂的同行朋友们&#xff0c;希望大家可以拿到理想offer。 自我介绍 我是16年从南京工业大学毕…

java ssm idea高校图书借阅管理系统设计2z87z

本论文是以构建高校图书管理系统设计为目标&#xff0c;使用 jsp制作&#xff0c;由前台用户图书借阅、后台管理员图书分类两大部分组成。着重论述了系统设计分析&#xff0c;系统的实现&#xff08;用户注册模块&#xff0c;用户登录&#xff0c;用户图书借阅模块&#xff0c;…

ONNXRUNTUIME c++使用与相关资料(暂记)

下面的教程是在linux系统上运行的&#xff0c;如果想在windows系统上运行&#xff0c;可以看官方链接或中文教程https://bbs.huaweicloud.com/blogs/335706&#xff0c;官方链接中有完整的VS的带.sln的项目。 ONNXRUNTUIME OPENCV不支持某些算子(挤压层在opencv 中不支持) 安…