Launcher3 定制桌面行列数

Android13 Launcher3修改Workspace布局(layout) 修改Workspace的图标的数量、图标大小、图标之间的间隙、热座图标数量、整体布局、图标与文字间的间隙等 阅读详情

一.Launcher3默认显示行列数是通过device_profiles.xml这个文件配置的,文件内容是


<profiles xmlns:launcher="http://schemas.android.com/apk/res-auto" >

    <profile
        launcher:name="Super Short Stubby"
        launcher:minWidthDps="255"
        launcher:minHeightDps="300"
        launcher:numRows="2"
        launcher:numColumns="3"
        launcher:numFolderRows="2"
        launcher:numFolderColumns="3"
        launcher:minAllAppsPredictionColumns="3"
        launcher:iconSize="248"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="3"
        launcher:defaultLayoutId="@xml/default_workspace_3x3"
        />

    <profile
        launcher:name="Shorter Stubby"
        launcher:minWidthDps="255"
        launcher:minHeightDps="400"
        launcher:numRows="3"
        launcher:numColumns="3"
        launcher:numFolderRows="3"
        launcher:numFolderColumns="3"
        launcher:minAllAppsPredictionColumns="3"
        launcher:iconSize="48"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="3"
        launcher:defaultLayoutId="@xml/default_workspace_3x3"
        />

    <profile
        launcher:name="Short Stubby"
        launcher:minWidthDps="275"
        launcher:minHeightDps="420"
        launcher:numRows="3"
        launcher:numColumns="4"
        launcher:numFolderRows="3"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="48"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_4x4"
        />

    <profile
        launcher:name="Stubby"
        launcher:minWidthDps="255"
        launcher:minHeightDps="450"
        launcher:numRows="3"
        launcher:numColumns="4"
        launcher:numFolderRows="3"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="48"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_4x4"
        />

    <profile
        launcher:name="Nexus S"
        launcher:minWidthDps="296"
        launcher:minHeightDps="491.33"
        launcher:numRows="4"
        launcher:numColumns="4"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="48"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_4x4"
        />

    <profile
        launcher:name="Nexus 4"
        launcher:minWidthDps="359"
        launcher:minHeightDps="567"
        launcher:numRows="4"
        launcher:numColumns="4"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="54"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_4x4"
        />

    <profile
        launcher:name="Nexus 5"
        launcher:minWidthDps="335"
        launcher:minHeightDps="567"
        launcher:numRows="4"
        launcher:numColumns="4"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="54"
        launcher:iconTextSize="13.0"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_4x4"
        />

    <profile
        launcher:name="Large Phone"
        launcher:minWidthDps="406"
        launcher:minHeightDps="694"
        launcher:numRows="5"
        launcher:numColumns="5"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="4"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="56"
        launcher:iconTextSize="14.4"
        launcher:numHotseatIcons="5"
        launcher:defaultLayoutId="@xml/default_workspace_5x5"
        />

    <profile
        launcher:name="Nexus 7"
        launcher:minWidthDps="575"
        launcher:minHeightDps="904"
        launcher:numRows="5"
        launcher:numColumns="6"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="5"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="64"
        launcher:iconTextSize="14.4"
        launcher:numHotseatIcons="7"
        launcher:defaultLayoutId="@xml/default_workspace_5x6"
        />

    <profile
        launcher:name="Nexus 10"
        launcher:minWidthDps="727"
        launcher:minHeightDps="1207"
        launcher:numRows="2"
        launcher:numColumns="3"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="5"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="76"
        launcher:iconTextSize="14.4"
        launcher:numHotseatIcons="7"
        launcher:defaultLayoutId="@xml/default_workspace_5x6"
        />

    <profile
        launcher:name="20-inch Tablet"
        launcher:minWidthDps="1527"
        launcher:minHeightDps="2527"
        launcher:numRows="7"
        launcher:numColumns="7"
        launcher:numFolderRows="6"
        launcher:numFolderColumns="6"
        launcher:minAllAppsPredictionColumns="4"
        launcher:iconSize="100"
        launcher:iconTextSize="20.0"
        launcher:numHotseatIcons="7"
        launcher:defaultLayoutId="@xml/default_workspace_5x6"
        />

</profiles>

二.该配置文件是在InvariantDeviceProfile类的getPredefinedDeviceProfiles方法加载

 ArrayList<InvariantDeviceProfile> getPredefinedDeviceProfiles(Context context) {
        ArrayList<InvariantDeviceProfile> profiles = new ArrayList<>();
        try (XmlResourceParser parser = context.getResources().getXml(R.xml.device_profiles)) {
            final int depth = parser.getDepth();
            int type;

            while (((type = parser.next()) != XmlPullParser.END_TAG ||
                    parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
                if ((type == XmlPullParser.START_TAG) && "profile".equals(parser.getName())) {
                    TypedArray a = context.obtainStyledAttributes(
                            Xml.asAttributeSet(parser), R.styleable.InvariantDeviceProfile);
                    int numRows = a.getInt(R.styleable.InvariantDeviceProfile_numRows, 0);
                    int numColumns = a.getInt(R.styleable.InvariantDeviceProfile_numColumns, 0);        Log.e("TAG", ">>>>>>>>>>>3>>>>"+numColumns+"#"+a.getString(R.styleable.InvariantDeviceProfile_name));
                    float iconSize = a.getFloat(R.styleable.InvariantDeviceProfile_iconSize, 0);
                    profiles.add(new InvariantDeviceProfile(
                            a.getString(R.styleable.InvariantDeviceProfile_name),
                            a.getFloat(R.styleable.InvariantDeviceProfile_minWidthDps, 0),
                            a.getFloat(R.styleable.InvariantDeviceProfile_minHeightDps, 0),
                            numRows,
                            numColumns,
                            a.getInt(R.styleable.InvariantDeviceProfile_numFolderRows, numRows),
                            a.getInt(R.styleable.InvariantDeviceProfile_numFolderColumns, numColumns),
                            a.getInt(R.styleable.InvariantDeviceProfile_minAllAppsPredictionColumns, numColumns),
                            iconSize,
                            a.getFloat(R.styleable.InvariantDeviceProfile_landscapeIconSize, iconSize),
                            a.getFloat(R.styleable.InvariantDeviceProfile_iconTextSize, 0),
                            a.getInt(R.styleable.InvariantDeviceProfile_numHotseatIcons, numColumns),
                            a.getResourceId(R.styleable.InvariantDeviceProfile_defaultLayoutId, 0),
                            a.getResourceId(R.styleable.InvariantDeviceProfile_demoModeLayoutId, 0)));
                    a.recycle();
                }
            }
        } catch (IOException|XmlPullParserException e) {
            throw new RuntimeException(e);
        }
        return profiles;
    }

 

Launcher图标加载流程二 阅读详情

相关推荐

【 OpenHarmony 4.1 Launcher 魔改之路 】-- 桌面布局定制

阅读本篇文章之前,有几个需要说明一下: 1. 调试设备:平板,如果你是开发者手机,一样可以加 Log 调试,源码仍然是手机和平板一起分析; 2. 文章中的 Log 信息所显示的数值可能跟你的设备不一样,以你调试的数据为准。 3. 装个逼:目前好像 OH 社区或者其它开发者还没有针对 OH 的系统应用,比如 Launcher 写过非常深入的源码解析类文章,所以此类文章,**仅供大家参考学习,如转载或引用,请标明出处**!

Fucking Android & Compose & Harmony & Spring Boot ... 2040

Launcher3 UI初始化 布局的动态设置

一.Launcher3中各个控件的大小在不同的设备上,初始化大小是不一样的,为了屏幕适配,需要动态的去设置布局大小,布局大小的设置是在Launcher3的onCreate方法中,调用了mDeviceProfile.layout(this, false),代码是: public void layout(Launcher launcher, boolean notifyListeners) { ...

yuemingxingxing的博客 576

安卓13 Launcher3 深度定制:从DeviceProfile解析到布局实战

本文深入解析了安卓13 Launcher3深度定制的核心——DeviceProfile机制。通过剖析DeviceProfile.java与device_profiles.xml的联动原理,并结合实战案例(如将6x5网格修改为7x6布局、调整搜索框与预设默认应用),系统性地指导开发者掌握Launcher主页布局的自定义与适配技巧,解决多屏幕适配中的常见问题。

whisky的博客 911

修改android N 的Launcher3桌面显示的行数列数

修改android N 的Launcher3桌面显示的行数列数在InvariantDeviceProfile中会根据屏幕的不同去动态适配应用图标和字体和行列数。InvariantDeviceProfile(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_

yxdspirit的专栏 2480

安卓13 Launcher3自定义布局全攻略:从修改行列数到隐藏Hotseat

本文详细介绍了安卓13 Launcher3的深度定制方法,包括修改行列数、隐藏Hotseat等高级布局技巧。通过解析关键配置文件和实战步骤,帮助开发者实现从基础到高级的主页布局定制,提升用户界面体验和操作效率。

weixin_29309213的博客 228

Android Launcher3深度定制指南:从源码解读到实战优化

Launcher作为Android系统的核心用户界面,其定制开发涉及系统框架与应用层的深度交互。理解其模块化架构与数据加载原理,是进行功能扩展与性能优化的基础。在Android 10/11版本中,手势导航集成、作用域存储适配等新特性,进一步提升了定制的技术价值。本文聚焦于Launcher3的深度定制,通过解析核心模块如CellLayout、InvariantDeviceProfile及QuickStep,并结合实战案例,系统阐述如何实现桌面网格调整、手势交互优化等定制需求,为ROM定制与系统开发提供工程实践

weixin_34268843的博客 391

Android Launcher3 修改行数和列数

从R.xml.device_profiles这个文件中读取数据。修改 numHotseatIcons的数量即可。根据屏幕尺寸设置不同的布局。

xiaowang_lj的博客 927

Android13 Launcher3深度定制:从静态布局到动态管理的进阶实践

本文深入探讨了Android13 Launcher3的深度定制实践,从静态布局到动态管理的进阶技术。通过解析Launcher3的架构调整、布局文件定制、动态图标管理及性能优化等核心要点,帮助开发者掌握自定义桌面应用的关键技术,提升开发效率与用户体验。

weixin_31102231的博客 184

Launcher定制

1. 修改Launcher中显示的预置app default_workspace.xml packageName:包名 className :在桌面上显示的activity screen : 在哪一个screen添加 x,y: 在screen中的位置 2. 修改屏幕数目(

pgalxx的专栏 3709

实战避坑:Launcher3文件夹定制全攻略(9宫格、透明背景、固定网格布局)

本文详细解析了Android系统Launcher3文件夹的深度定制开发技巧,包括九宫格缩略图、透明背景和固定网格布局的实现方案。通过核心类分析和实战代码示例,帮助开发者避免常见问题,提升定制效率,特别适用于Android10及以上版本的系统开发。

weixin_30379531的博客 415

Android13 Launcher3桌面布局自定义指南:从图标大小到边距调整的完整配置

本文提供了一份Android 13 Launcher3桌面布局深度自定义的实战指南。文章详细解析了Launcher3的核心架构,并重点指导如何通过修改device_profiles.xml配置文件,实现对Workspace网格、图标大小、边距等参数的像素级调整,从而打造个性化桌面体验。

weixin_29159441的博客 327

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

Android13 Launcher3桌面布局魔改指南:从6x3到自定义行列的完整实战

本文详细解析了Android13 Launcher3桌面布局的深度定制方法,从基础的行列配置修改到异形屏适配实战。通过调整device_profiles.xml和default_workspace.xml等核心配置文件,开发者可以实现从6x3到自定义行列的布局魔改,并解决刘海屏、挖孔屏等异形屏的适配问题。

weixin_28273593的博客 377

数码管动态扫描避坑指南:如何用188芯片实现50Hz无闪烁显示?

本文深入解析188数码管动态扫描技术,提供工业级无闪烁显示方案。通过优化轮询扫描机制、硬件电路设计和软件架构,实现50Hz高刷新率显示,解决亮度不均和鬼影问题,适用于医疗设备和工业控制面板等高要求场景。

hhh00的博客 975

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 343

Android 13 Launcher3 桌面布局修改实战:从数格子到改XML的保姆级避坑指南

本文详细解析了Android 13中Launcher3桌面布局的定制方法,从基础架构到高级技巧,提供从数格子到改XML的完整指南。通过实战案例和避坑建议,帮助开发者高效完成桌面布局修改,实现个性化定制。

349

Android 12 系统横屏时,开机动画有两秒显示不全

平板系统默认横屏时,开机会旋转90度,显示的分辨率WxH,会变成HxW.但又会很快被SurfaceFlinger的SurfaceFlinger::processDisplayChanged 娇正。所以为了保险,可以在开机动画没结束之前,禁止旋转事件。在Android 12 产品定制化开发中,由于系统默认方向为竖屏,平板电脑要横屏显示。系统在开机时,有时因为旋转,会出现动画只显示一部分。

448313096@qq.com 1181

告别抽屉和Hotseat!Android 11 Launcher3桌面改造实战:打造类iOS的单层桌面体验

本文详细介绍了如何将Android 11的Launcher3从默认的双层抽屉式桌面改造为类iOS的单层桌面体验。通过深度解析Launcher3核心架构,逐步实现移除抽屉界面、消除Hotseat常驻栏以及重构应用加载逻辑等关键步骤,帮助开发者为特定硬件打造更简洁高效的单层桌面解决方案。

weixin_30505225的博客 365

基于点云数据的统计滤波算法改进

随着三维视觉和点云处理技术的发展,点云数据在机器人、自动驾驶、增强现实等领域得到了广泛应用。而点云数据中常常包含着各种噪声和异常点,这些噪声和异常点会影响后续的数据处理和分析任务。因此,对点云数据进行滤波处理是必不可少的一步。在点云滤波算法中,统计滤波(Statistical Filtering)是一种常见且有效的方法。它通过对点云数据进行统计分析,将噪声和异常点剔除或修复,从而得到更为准确和可靠的点云数据。本文将介绍一种改进的统计滤波算法,并提供相应的源代码实现。

QfcaLinux的博客 292

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!!

IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试;

风云说通信 2056

Android 13 Launcher3深度定制实战:打造16宫格默认文件夹的终极指南

本文详细讲解如何将Android 13 Launcher3默认文件夹布局改造为16宫格(4x4)。首先分析Launcher3架构,重点介绍文件夹相关的核心组件(Workspace、CellLayout、FolderPagedView等)。然后提供两种具体实现方案:1)修改DeviceProfile全局配置(推荐);2)直接调整FolderPagedView行列数。文章包含环境搭建、源码剖析、XML配置、动画优化等内容,并通过完整的代码修改清单和测试用例指导实践。最后还探讨了进阶优化方向和其他定制场景的拓展思

油墨香^-^的博客 400

Python 爬虫实战:爬取今日头条文章与阅读量数据

本文详细介绍了基于Python爬取今日头条文章与阅读量数据的完整方案。通过分析今日头条API接口,采用Requests+正则表达式技术实现数据抓取,重点解决加密参数构造、请求头模拟、反爬规避等核心问题。文章包含文章列表获取、详情数据提取、互动数据采集等完整流程,并提供数据存储与基础分析方法。同时强调合规使用爬虫技术,控制爬取频率,避免干扰平台运营。该方案可为内容传播分析、用户兴趣研究提供数据支持,但需注意接口参数更新和反爬机制变化,适时调整代码实现。

2503_91057718的博客 2519

Android 13 Launcher3 桌面大改造:手把手教你修改默认布局文件,替换预装应用

本文详细介绍了如何在Android 13中深度定制Launcher3桌面,包括修改默认布局文件和替换预装应用。通过解析Launcher3的架构、定位布局文件、设备特性适配以及编译部署等步骤,帮助开发者实现个性化的桌面定制。文章还提供了常见问题解决方案和高级定制技巧,适合系统开发者和ROM定制者参考。

weixin_33137081的博客 323

【智能车Code review】—曲率计算、最小二乘法拟合

【1】曲率计算函数 选三个点计算曲率 float process_curvity(byte x1, byte y1, byte x2, byte y2, byte x3, byte y3) { float K; int S_of_ABC = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2; //面积的符号表示方向 byte q1 = (byte)((x2 - x1) * (x2 - x1) + (y2 - y1) *

hanhan的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android13-修改主界面apk摆放位置(Launcher3)

Android13-修改主界面apk摆放位置(Launcher3)

李予浙的博客 2232

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Launcher3 Widget拖拽到桌面的流程分析
下一篇: Launcher3 怎么创建一个Widget
网络卷毛
博客等级 码龄14年 13粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值