关于Android10和11系统Launcher3的定制有很多,根据项目的需求会进行各种定制开发,
于是就需要研究Launcher3的源码。本文主要从Android 11的Launcher3QuickStep着手
(go版本或者其他版本类似)从常用的修改进行分析,首先就得大致理解 Launcher3各个
类的作用。
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. 去除抽屉功能,屏蔽上拉事件与指示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方法

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布局:

文件夹缩率图背景和展开文件夹背景根据系统值或者主题设置成纯色的,不美观,根据
需要可修改被壁纸默认的背景,比较美观大方,修改点如下:
FolderAnimationManager.java 类的getAnimator方法中屏蔽背景的设置,变量
mFolderBackground设置背景,如图:

Launcher3默认情况系统预制应用显示在all工作区,Workspace区只显示xml配置中显示
的几个图标,如需要预制应用都显示Workspace工作区,需要做以下修改:
LoaderTask.java类中的run方法把加载的应用添加到workspace工作区

Launcher3默认情况安装的应用显示在all工作区,如需在安装的应用在workspace工作区
显示,需要添加新逻辑把应用添加到workspace工作区,修改如下:
1. PackageUpdatedTask.java类添加updateToWorkSpace方法,此方法实现安装的
APP添加到workspace工作区的逻辑:


2. execute方法中添加updateToWorkSpace方法更新APP显示到workspace工作区

1. device_profiles.xml文件中配置图标显示的矩阵(包括文件夹),图标大小及图标名
称大小等配置

2.创建一个default_workspace_4x5.xml(名称根据需求定义),在device_profiles.xml
文件中引用此xml

1. DeviceProfile类的updateIconSize方法修改workspace工作区图标的大小:
iconSizePx表示图标大小,可重新赋值;
iconTextSizePx表示图标大小,可重新赋值;
folderIconSizePx表示文件夹图标大小,可重新赋值;
2. DeviceProfile类的updateFolderCellSize方法修改展开文件夹图标的小及间距:
folderChildIconSizePx表示展开文件夹内图标大小,可重新赋值;
folderChildTextSizePx表示展开文件夹内图标文字大小,可重新赋值;
folderCellWidthPx表示展开文件夹内图标横向间距,可重新赋值;
folderCellHeightPx表示展开文件夹内图标竖向间距,可重新赋值;
3. ShortcutAndWidgetContainer类的layoutChild方法修改展开文件夹框上下边距:
childLeft表示展开文件夹内展示的矩形框左边距,可重新赋值;
childTop表示展开文件夹内展示的矩形框上边距,可重新赋值;
1. ClippedFolderIconLayoutRule类实现九宫格功能
MAX_NUM_ITEMS_IN_PREVIEW变量表示显示几个缩略图标,改为9
MIN_SCALE变量表示缩略图标最小大小,改为0.22f
MAX_SCALE变量表示缩略图标最大大小,改为0.22f(不做伸缩)
scaleForItem函数固定缩略图标大小:

getPosition函数计算缩略图图标排序,对函数进行重写:

computePreviewItemDrawingParams函数控制缩略图图标排序

2. FolderGridOrganizer类对isItemInPreview函数进行重写

1. 文件夹图标名字显示
Folder类的onFinishInflate函数修改文字参数

FolderIcon类的inflateIcon函数修改逻辑

2. 文件夹图标圆角配置
folder_shapes.xml文件配置参数
3. 文件夹背景透明
FolderAnimationManager类的构造方法屏蔽mFolderBackground赋值

FolderAnimationManager类的getAnimator函数屏蔽mFolderBackground赋值

FolderIcon类的dispatchDraw函数屏蔽mBackground变量赋值
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函数进行从写,屏蔽原生逻辑

此函数中添加新计算逻辑

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、高通平台。
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro
我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da
我已经通过提供MagickWand.h的路径尝试了一切,我安装了命令工具。谁能帮帮我?$geminstallrmagick-v2.13.1Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingrmagick:ERROR:Failedtobuildgemnativeextension./Users/ghazanfarali/.rvm/rubies/ruby-1.8.7-p357/bin/rubyextconf.rbcheckingforRubyversion>=1.8.5...yescheckingfor/
我正在使用macos,我想使用ruby驱动程序连接到sqlserver。我想使用tiny_tds,但它给出了缺少free_tds的错误,但它已经安装了。怎么能过这个?~brewinstallfreetdsWarning:freetds-0.91.112alreadyinstalled~sudogeminstalltiny_tdsBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtiny_tds:ERROR:Failedtobuildgemnativeextension.完整日志如下:/System
我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat
如何解决这个错误:$rvminstall1.9.3Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.9/x86_64/ruby-1.9.3-p547.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforosx.Certificatesin'/usr/local/etc/openssl/cert.pem'arealr