马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
一、技术背景与实现原理
在Android 13 Launcher3定制开发中,需屏蔽HotSeat区域的文件夹创建功能。该功能涉及的焦点事故处理流程如下:
复制
- [拖拽事件] -> [Workspace.onDrop()] -> [CellLayout.performReorder()]
- └─> [createUserFolderIfNecessary()]
- └─> [FolderIcon.createFromInfo()]
复制代码 关键判定逻辑位于Workspace.java,该文件负责管理桌面工作区的布局渲染与交互事故。HotSeat作为特别容器,其标识为CONTAINER_HOTSEAT(值-101)。
二、焦点代码修改方案
2.1 阻断文件夹创建入口
在createUserFolderIfNecessary方法首部增加容器类型判定:
diff
复制
- boolean createUserFolderIfNecessary(View newView, int container, CellLayout target, ...) {
- + // 拦截HotSeat容器类型
- + if (container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
- + return false;
- + }
-
- if (distance > target.getFolderCreationRadius(targetCell)) return false;
- View v = target.getChildAt(targetCell[0], targetCell[1]);
- ...
- }
复制代码 2.2 消除文件夹预览残留
修改manageFolderFeedback中的条件判定:
diff
复制
- private void manageFolderFeedback(...) {
- final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
- ItemInfo info = dragObject.dragInfo;
-
- - boolean userFolderPending = willCreateUserFolder(info, dragOverView, false);
- + boolean userFolderPending = willCreateUserFolder(info, dragOverView, false)
- + && !isHotseatLayout(mDragTargetLayout);
-
- if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
- // 创建文件夹预览逻辑
- }
- }
复制代码 需实现容器类型判定方法:
java
复制
- private boolean isHotseatLayout(CellLayout layout) {
- return mLauncher.getHotseat().getLayout() == layout;
- }
复制代码 三、事故处理机制详解
3.1 拖拽事故处理流程
java
复制
- // Workspace.java
- public void onDrop(DragObject dragObject) {
- if (createUserFolderIfNecessary(...)) {
- // 创建文件夹
- } else if (mDragOverFolderIcon != null) {
- // 添加到现有文件夹
- } else {
- // 常规放置逻辑
- }
- }
复制代码 3.2 文件夹创建判定矩阵
判定维度常规区域HotSeat容器类型>=0-101拖拽距离阈值(pixel)120∞答应文件夹✓✗预览动画✓✗ 四、深度适配发起
java
复制
- // 动态计算HotSeat尺寸
- int hotseatCellSize = mLauncher.getDeviceProfile().hotseatCellSizePx;
复制代码 java
复制
- // 禁用语音提示
- if (!AccessibilityManager.getInstance(mContext).isEnabled()) {
- dragObject.stateAnnouncer = null;
- }
复制代码 java
复制
- // 重写拖拽结束回调
- @Override
- public void onDragEnd() {
- if (isHotseatLayout(mDragTargetLayout)) {
- mDragVisualizer.reset();
- }
- }
复制代码 五、验证方案
5.1 单元测试用例
java
复制
- @Test
- public void testHotseatFolderBlock() {
- // 模拟HotSeat拖拽操作
- dragItemToHotseat(icon);
-
- assertNull("Folder should not be created",
- mHotseat.findFolderContaining(icon));
- }
复制代码 该方案已在多款搭载Android 13的OEM设备验证通过,通过修改关键拦截点实现精准控制,既保持系统原有交互逻辑,又满足定制需求。发起配合CTS Verifier测试模块LauncherTests进行全量验证。
转载请注明出处Android Launcher3 HotSeat文件夹创建禁止方案全解析-CSDN博客,谢谢!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |