Android Launcher3 HotSeat文件夹创建禁止方案全解析

打印 上一主题 下一主题

主题 1699|帖子 1699|积分 5097

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、技术背景与实现原理

在Android 13 Launcher3定制开发中,需屏蔽HotSeat区域的文件夹创建功能。该功能涉及的焦点事故处理流程如下:
复制
  1. [拖拽事件] -> [Workspace.onDrop()] -> [CellLayout.performReorder()]
  2.             └─> [createUserFolderIfNecessary()]
  3.                 └─> [FolderIcon.createFromInfo()]
复制代码
关键判定逻辑位于Workspace.java,该文件负责管理桌面工作区的布局渲染与交互事故。HotSeat作为特别容器,其标识为CONTAINER_HOTSEAT(值-101)。
二、焦点代码修改方案

2.1 阻断文件夹创建入口

在createUserFolderIfNecessary方法首部增加容器类型判定:
diff
复制
  1. boolean createUserFolderIfNecessary(View newView, int container, CellLayout target, ...) {
  2. +   // 拦截HotSeat容器类型
  3. +   if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
  4. +       return false;
  5. +   }
  6.    
  7.     if (distance > target.getFolderCreationRadius(targetCell)) return false;
  8.     View v = target.getChildAt(targetCell[0], targetCell[1]);
  9.     ...
  10. }
复制代码
2.2 消除文件夹预览残留

修改manageFolderFeedback中的条件判定:
diff
复制
  1. private void manageFolderFeedback(...) {
  2.     final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
  3.     ItemInfo info = dragObject.dragInfo;
  4.    
  5. -   boolean userFolderPending = willCreateUserFolder(info, dragOverView, false);
  6. +   boolean userFolderPending = willCreateUserFolder(info, dragOverView, false)
  7. +       && !isHotseatLayout(mDragTargetLayout);
  8.    
  9.     if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
  10.         // 创建文件夹预览逻辑
  11.     }
  12. }
复制代码
需实现容器类型判定方法:
java
复制
  1. private boolean isHotseatLayout(CellLayout layout) {
  2.     return mLauncher.getHotseat().getLayout() == layout;
  3. }
复制代码
三、事故处理机制详解

3.1 拖拽事故处理流程

java
复制
  1. // Workspace.java
  2. public void onDrop(DragObject dragObject) {
  3.     if (createUserFolderIfNecessary(...)) {
  4.         // 创建文件夹
  5.     } else if (mDragOverFolderIcon != null) {
  6.         // 添加到现有文件夹
  7.     } else {
  8.         // 常规放置逻辑
  9.     }
  10. }
复制代码
3.2 文件夹创建判定矩阵

判定维度常规区域HotSeat容器类型>=0-101拖拽距离阈值(pixel)120∞答应文件夹✓✗预览动画✓✗ 四、深度适配发起


  • 多分辨率适配
java
复制
  1. // 动态计算HotSeat尺寸
  2. int hotseatCellSize = mLauncher.getDeviceProfile().hotseatCellSizePx;
复制代码

  • 无障碍模式兼容
java
复制
  1. // 禁用语音提示
  2. if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
  3.     dragObject.stateAnnouncer = null;
  4. }
复制代码

  • 动画效果优化
java
复制
  1. // 重写拖拽结束回调
  2. @Override
  3. public void onDragEnd() {
  4.     if (isHotseatLayout(mDragTargetLayout)) {
  5.         mDragVisualizer.reset();
  6.     }
  7. }
复制代码
五、验证方案

5.1 单元测试用例

java
复制
  1. @Test
  2. public void testHotseatFolderBlock() {
  3.     // 模拟HotSeat拖拽操作
  4.     dragItemToHotseat(icon);
  5.    
  6.     assertNull("Folder should not be created",
  7.         mHotseat.findFolderContaining(icon));
  8. }
复制代码
该方案已在多款搭载Android 13的OEM设备验证通过,通过修改关键拦截点实现精准控制,既保持系统原有交互逻辑,又满足定制需求。发起配合CTS Verifier测试模块LauncherTests进行全量验证。
转载请注明出处Android Launcher3 HotSeat文件夹创建禁止方案全解析-CSDN博客,谢谢!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

不到断气不罢休

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表