《基于Workspace.java的Launcher3改造:HotSeat区域动态阻断文件夹生成机制》

news2025/3/19 11:52:20

1. 需求背景与技术挑战

在Android 13系统Launcher3定制化开发中,需实现禁止HotSeat区域创建文件夹的功能。原始逻辑中,当用户拖拽应用图标至HotSeat区域相邻图标时,会触发FolderIcon的实例化。本文将深入分析Launcher3的文件夹创建机制,并提供可靠的解决方案。

2. 核心修改文件定位

复制

packages/apps/Launcher3/src/com/android/launcher3/Workspace.java

3. 技术实现与原理分析

3.1 文件夹创建核心流程

Launcher3的文件夹创建主要通过Workspace.onDrop()触发,关键路径如下:

  1. 事件触发:拖拽操作释放时调用CellLayout.performReorder()

  2. 文件夹生成:通过createUserFolderIfNecessary()创建Folder实例

  3. 视图更新:调用FolderIcon.performCreateAnimation()完成视觉反馈

3.2 HotSeat限制实现方案

3.2.1 核心拦截逻辑

createUserFolderIfNecessary()方法入口添加HotSeat容器判断:

java

复制

boolean createUserFolderIfNecessary(View newView, long container, CellLayout target,
        int[] targetCell, float distance, boolean external, DragView dragView,
        Runnable postAnimationRunnable) {
    
    // 核心拦截逻辑
    if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
        return false; // 直接阻断HotSeat文件夹创建流程
    }

    if (distance > mMaxDistanceForFolderCreation) return false;
    View v = target.getChildAt(targetCell[0], targetCell[1]);
    // ...后续原有逻辑
}
3.2.2 视觉反馈处理

修改manageFolderFeedback()中的文件夹状态判断:

java

复制

private void manageFolderFeedback(float distance, DragObject dragObject) {
    // ...原有条件判断
    
    final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
    ItemInfo info = dragObject.dragInfo;
    
    // 增强型条件判断
    boolean isHotseat = mLauncher.isHotseatLayout(mDragTargetLayout);
    boolean userFolderPending = !isHotseat && willCreateUserFolder(info, dragOverView, false);
    
    // ...后续处理逻辑
}

3.3 关键类说明

类名职责描述
Workspace管理多屏工作区,处理拖拽事件
CellLayout网格布局管理器,处理Item位置计算
FolderIcon文件夹图标视图,处理点击/展开事件
Folder文件夹内容视图,管理内部Item布局

4. 实现效果验证

完成修改后需进行以下测试:

  1. 正向测试

    • 在主工作区拖拽图标形成文件夹

    • 现有文件夹添加/移除应用

    • 跨屏幕拖拽创建文件夹

  2. 反向测试

    • HotSeat区域拖拽图标保持独立

    • HotSeat区域不显示文件夹创建动画

    • HotSeat与工作区之间的拖拽行为隔离

  3. 边界测试

    • HotSeat最后一个空位拖拽行为

    • 同时包含工作区和HotSeat的多选操作

    • 横竖屏切换后的拖拽一致性

5. 技术原理深度解析

5.1 拖拽事件传递链

复制

DragLayer → Workspace → CellLayout
     ↓
FolderIcon (if applicable)

5.2 文件夹创建条件判断矩阵

条件主工作区HotSeat
拖拽距离阈值30dp30dp
容器类型检查允许禁止
目标视图有效性必需忽略
动画反馈生成启用禁用

5.3 性能优化建议

  1. 使用View.isAttachedToWindow()检查视图有效性

  2. CellLayout.getChildAt()调用进行空指针防护

  3. manageFolderFeedback()中添加早期返回条件

  4. 使用SparseArray优化多屏工作区查询

6. 扩展性设计

通过继承Workspace实现可配置策略:

java

复制

public class CustomWorkspace extends Workspace {
    private boolean mAllowHotseatFolders = false;

    @Override
    boolean createUserFolderIfNecessary(...) {
        if (!mAllowHotseatFolders && 
            container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
            return false;
        }
        return super.createUserFolderIfNecessary(...);
    }
}

该方案已在Android 13代码基线验证通过,适用于各主流Launcher3定制分支(如AOSP、LineageOS等),可根据具体需求通过资源覆盖或运行时配置进行灵活调整。

转载注明出处《基于Workspace.java的Launcher3改造:HotSeat区域动态阻断文件夹生成机制》-CSDN博客,谢谢! 

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

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

相关文章

Cursor在内网环境配置自定义DeepSeek API

关键字 Cursor、DeepSeek、API配置、内网代理、HTTP/2 背景环境 使用Cursor集成环境开发程序。但是我使用公司的内网并不能使用cursor自带的模型,于是我就想使用DeepSeek官方的API服务。 环境:Windows 11系统 解决过程 网络检测 首先进行环境检测&am…

【初学者】解释器和脚本各是什么?有什么区别与联系?

李升伟 整理 解释器和脚本的定义 1. 解释器(Interpreter) 定义:解释器是一个程序,负责逐行读取并执行代码。它将源代码翻译成机器能理解的指令,并立即执行。特点: 逐行执行代码。适合交互式编程&#xf…

Kafka跨集群数据备份与同步:MirrorMaker运用

#作者:张桐瑞 文章目录 前言MirrorMaker是什么运行MirrorMaker各个参数的含义 前言 在大多数情况下,我们会部署一套Kafka集群来支撑业务需求。但在某些特定场景下,可能需要同时运行多个Kafka集群。比如,为了实现灾难恢复&#x…

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…

观察者模式详解:用 Qt 信号与槽机制深入理解

引言 你是否曾遇到这样的需求:一个对象的状态发生变化后,希望通知其他对象进行相应的更新?比如: 新闻订阅系统:当新闻发布后,所有订阅者都会收到通知。股票行情推送:股价变化时,所…

OSWorld:开启多模态智能体的真实计算机环境革命

OSWorld:开启多模态智能体的真实计算机环境革命 在人工智能技术突飞猛进的今天,多模态智能体正逐步突破实验室的限制,试图融入人类的日常工作场景。然而,如何评估这些智能体在真实计算机环境中处理开放式任务的能力,成为学术界和产业界共同关注的难题。2024年,由xlang-ai…

LabVIEW烟气速度场实时监测

本项目针对燃煤电站烟气流速实时监测需求,探讨了静电传感器结构与速度场超分辨率重建方法,结合LabVIEW多板卡同步采集与实时处理技术,开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行,提供高…

强化学习基础篇二:马尔可夫决策过程

写在前面 本文是对李沐等“动手学强化学习”教程的个人阅读总结,原文链接:动手学强化学习。 第3章 马尔可夫决策过程 3.1 重要性 马尔可夫决策过程是强化学习中的基础概念,强化学习中的环境就是一个马尔可夫决策过程,与多臂老虎…

EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级

客户的汽车零部件制造商需要升级其变速箱齿轮加工生产线,面临的关键挑战是整合新引进的欧洲齿轮精密检测设备(基于EtherCAT协议)与现有使用profinet协议自动化系统通信。 企业核心控制平台基于西门子PLC,而现场各工位采用分布式I/…

tongweb7控制台无法访问

tongweb7控制台无法访问 排查 1.首先确认版本,如果版本是轻量级版本,轻量版不支持会话(session)的备份和复制、管理控制台、APM 运维工具等企业级增量功能。 2.查看端口 命令:ss -tnlp 或者netstat -tnlp 确认控制台端口是否开启 3.在conf…

【STM32】从新建一个工程开始:STM32 新建工程的详细步骤

STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中,下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构:STD_STM…

搞定python之九----常用内置模块

本文是《搞定python》系列文章的第九篇,介绍常用的内置模块的使用。到此为止python的基础用法就彻底说完了,大家可以在此基础上学习爬虫、web处理等框架了。 本文的代码相对比较多,大家注意看代码即可。python的文档我贴出来,毕竟…

判断是不是完全二叉树(C++)

目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 定义队列,初始化根节点 4.2 层序遍历,处理每个节点 4.3 处理空节点 4.4 处理非空节点 5 总结 1 问题描述 给定一个二叉树,确定他是否是一…

神经外科手术规划的实现方案及未来发展方向

Summary: 手术规划软件 效果图,样例: 神经外科手术规划样例: 神经外科手术规划,三维重建,三维建模,三维可视化 Part1: 手术规划的定义与作用 一、手术规划的定义 手术规划是指在手术前,通过详…

easypoi导入Excel兼容日期和字符串格式的日期和时间

问题场景 在使用easypoi导入Excel时,涉及到的常用日期会有yyyy-MM-dd HH:mm:ss、yyyy-MM-dd和HH:mm:ss,但是Excel上面的格式可不止这些,用户总会输入一些其他格式,如 如果在定义verify时用下面这种格式定义,那么总会…

【计算机视觉】工业表计读数(2)--表计检测

1. 简介 工业表计(如压力表、电表、气表等)在工控系统、能源管理等领域具有重要应用。然而,传统人工抄表不仅工作量大、效率低,而且容易产生数据误差。近年来,基于深度学习的目标检测方法在工业检测中展现出极大优势&…

Zbrush插件安装

安装目录在: ...\Zbrush2022\ZStartup\ZPlugs64

LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0

前言 过去2年多的深入超过此前7年,全靠夜以继日的勤奋,一天当两天用,抠论文 抠代码 和大模型及具身同事讨论,是目前日常 而具身库里,idp3、π0、lerobot值得反复研究,故,近期我一直在抠π0及l…

OpenCV基础【图像和视频的加载与显示】

目录 一.创建一个窗口,显示图片 二.显示摄像头/多媒体文件 三.把摄像头录取到的视频存储在本地 四.鼠标回调事件 五.TrackBar滑动条 一.创建一个窗口,显示图片 import cv2img_path "src/fengjing.jpg" # 自己的图片路径 img cv2.imre…

杨校老师课堂之编程入门与软件安装【图文笔记】

亲爱的同学们,热烈欢迎踏入青少年编程的奇妙世界! 我是你们的授课老师杨校 ,期待与大家一同开启编程之旅。 1. 轻松叩开编程之门 1.1 程序的定义及生活中的应用 程序是人与计算机沟通的工具。在日常生活中,像手机里的各类 APP、电…