Launcher3 to Launchpad 01 布局修改

Launcher3 to Launchpad 01 布局修改

禁用相关布局 Todo list:

  • 禁用首页搜索框
  • 禁用 Hotseat
  • 禁用 DropTargetBar
  • 禁用上滑桌面展示 AllApps 弹窗
  • 禁用长按桌面展示选项菜单
  • 禁用长按 App 展示选项菜单
  • 禁用拖拽时桌面显示半透明遮罩
  • 禁用拖拽时桌面显示 App 目标位预览框

定义全局功能控制开关

java 复制代码
object LauncherFeatureConfig {

    /**
     * 控制 HotSeat 区是否展示
     */
    @JvmField
    val isHotseatEnable = false

    /**
     * 控制 DropTargetBar 区是否展示
     */
    @JvmField
    val isDropTargetBarEnable = false

    /**
     * 控制长按图标 OptionsPopup 是否展示
     */
    @JvmField
    val isAppOptionsPopupEnable = false

    /**
     * 控制长按桌面 OptionsPopup 是否展示
     */
    @JvmField
    val isWorkspaceOptionsPopupEnable = false

    /**
     * 控制上滑 AllApps 窗口是否展示
     */
    @JvmField
    val isAllAppsSheetEnable = false

    /**
     * 控制拖拽时 Workspace 半透明遮罩是否可见
     */
    @JvmField
    val isWorkspaceDraggingBgVisible = false

    /**
     * 控制拖拽 App 时目标位预览框是否可见
     */
    @JvmField
    val isAppDropLocationVisible = false
}

禁用相关布局

禁用搜索按钮

在 launcher3 目录下的 build.gradle 文件中找到 QSB_ON_FIRST_SCREEN, 将其值设为 false:

kotlin 复制代码
buildConfigField("boolean", "QSB_ON_FIRST_SCREEN", "false")

禁用 Hotseat

  1. 修改 default_workspace_axb.xml:
  • launcher:container=-101 表示容器为 Hotseat,清空所有相关配置
xml 复制代码
<!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
<!-- Mail Calendar Gallery Store Internet Camera -->
<!-- <resolve
    launcher:container="-101"
    launcher:screen="0"
    launcher:x="0"
    launcher:y="0" >
    <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_EMAIL;end" />
    <favorite launcher:uri="mailto:" />
</resolve> -->
  1. 修改 launcher3/src/main/res/layout/launcher.xml 文件:
  • 隐藏 Launcher 中 Hotseat 布局
  • 通过 1 和 2 的修改 Hotseat 区不再展示
xml 复制代码
<include
    id="@+id/hotseat"
    layout="@layout/hotseat"
    android:visibility="gone" />
  1. 修改 launcher3/src/main/java/com/android/launcher3/DeviceProfile.java
  • 将 Hotseat 区尺寸置为 0
java 复制代码
// Disable HotSeat
private void updateHotseatIconSize(int hotseatIconSizePx) {
    // Resize HotSeat
    if (!LauncherFeatureConfig.isHotseatEnable) {
        hotseatCellHeightPx = 0;
        hotseatBarSizePx = 0;
        return;
    }

    // Ensure there is enough space for folder icons, which have a slightly larger radius.
    hotseatCellHeightPx = (int) Math.ceil(hotseatIconSizePx * ICON_OVERLAP_FACTOR);
    ...
  1. 修改 launcher3/src/main/java/com/android/launcher3/Hotseat.java
  • Hotseat 区不响应手势事件
java 复制代码
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    // We allow horizontal workspace scrolling from within the Hotseat. We do this by delegating
    // touch intercept the Workspace, and if it intercepts, delegating touch to the Workspace
    // for the remainder of the this input stream.
    if (!LauncherFeatureConfig.isHotseatEnable) {
        return false;
    }
    ...
}
  1. 修改 launcher3/src/main/java/com/android/launcher3/Workspace.java
  • Hotseat 区不响应创建文件夹
java 复制代码
boolean createUserFolderIfNecessary(View newView, int container, CellLayout target,
            int[] targetCell, float distance, boolean external, DragObject d) {
  // Block HotSeat to create folder
  if (!LauncherFeatureConfig.isHotseatEnable && container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
      return false;
  }
  ...
}

private void manageFolderFeedback(float distance, DragObject dragObject) {
  if (distance > mDragTargetLayout.getFolderCreationRadius(mTargetCell)) {
      if ((mDragMode == DRAG_MODE_ADD_TO_FOLDER
              || mDragMode == DRAG_MODE_CREATE_FOLDER)) {
          setDragMode(DRAG_MODE_NONE);
      }
      return;
  }
  final View dragOverView = mDragTargetLayout.getChildAt(mTargetCell[0], mTargetCell[1]);
  ItemInfo info = dragObject.dragInfo;

  boolean userFolderPending = willCreateUserFolder(info, dragOverView, false);
  if (!LauncherFeatureConfig.isHotseatEnable) {
    boolean isHotseat = mLauncher.isHotseatLayout(mDragTargetLayout);
    userFolderPending = !isHotseat && userFolderPending;
  }

  if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
    ...
  }
  ...
}

禁用 DropTargetBar

  1. 修改 launcher3/src/main/java/com/android/launcher3/DeleteDropTarget.java:
  • supportsDrop 方法返回 isDropTargetBarEnable,控制是否展示 DeleteDropTarget:
java 复制代码
@Override
protected boolean supportsDrop(ItemInfo info) {
    return LauncherFeatureConfig.isDropTargetBarEnable;
}
  1. 修改 launcher3/src/main/java/com/android/launcher3/SecondaryDropTarget.java:
  • supportsDrop 方法返回 isDropTargetBarEnable,控制是否展示 SecondaryDropTarget:
java 复制代码
@Override
protected boolean supportsDrop(ItemInfo info) {
    return LauncherFeatureConfig.isDropTargetBarEnable;
}

禁用上滑桌面展示 AllApps 弹窗

  1. 修改 launcher3/src/main/java/com/android/launcher3/touch/AllAppsSwipeController.java:
  • canInterceptTouch 方法返回 false,控制不响应上滑事件
java 复制代码
@Override
protected boolean canInterceptTouch(MotionEvent ev) {
    // Disable AllAppsSheet
    if (!LauncherFeatureConfig.isAllAppsSheetEnable) {
        return false;
    }
    if (mCurrentAnimation != null) {
        // If we are already animating from a previous state, we can intercept.
        return true;
    }

禁用长按桌面展示选项菜单

  1. 修改 launcher3/src/main/java/com/android/launcher3/touch/WorkspaceTouchListener.java:
  • onLongPress 方法中添加判断,控制不展示长按菜单
java 复制代码
@Override
public boolean onLongPress(MotionEvent ev) {
    ...
    if (LauncherFeatureConfig.isWorkspaceOptionsPopupEnable) {
        mLauncher.showDefaultOptions(mTouchDownPoint.x, mTouchDownPoint.y);
    }
    ...
}

禁用长按 App 展示选项菜单

  1. 修改 launcher3/src/main/java/com/android/launcher3/BubbleTextView.java:
  • startLongPressAction 方法中添加判断,控制不展示长按菜单
java 复制代码
public PreDragCondition startLongPressAction() {
    // Disable app long press popup
    if (!LauncherFeatureConfig.isAppOptionsPopupEnable) {
        return null;
    }

    PopupContainerWithArrow popup = PopupContainerWithArrow.showForIcon(this);
    return popup != null ? popup.createPreDragCondition(true) : null;
}

禁用拖拽时桌面显示半透明遮罩

  1. 修改 launcher3/src/main/java/com/android/launcher3/Workspace.java:
  • onDragStart 方法中添加判断,控制不展示半透明遮罩
java 复制代码
@Override
public void onDragStart(DragObject dragObject, DragOptions options) {
    ...
    if (LauncherFeatureConfig.isWorkspaceDraggingBgVisible) {
        // Always enter the spring loaded mode
        mLauncher.getStateManager().goToState(SPRING_LOADED);
    }
    ...
}

禁用拖拽 App 时目标位预览框

  1. 修改 launcher3/src/main/java/com/android/launcher3/CellLayout.java:
  • mVisualizeDropLocation 变量的值设为 isAppDropLocationVisible
java 复制代码
private boolean mVisualizeDropLocation = LauncherFeatureConfig.isAppDropLocationVisible;

上面这些步骤做完,就可以获得一个干净的桌面了,下面往桌面添加所有应用图标。

相关推荐
传奇开心果编程14 小时前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack
腾讯端服务14 小时前
一码Duo端-Kuikly-iOS折叠屏新UI适配实践
android·ui·ios·kotlin·鸿蒙
T量子永生15 小时前
Android SISO 分布式编译集群配置方案
android·分布式·云计算·源代码管理
街头便衣15 小时前
OpenRouter周榜复算:164万亿token,输出2.55%,DeepSeek账单占1.4%
android·java·开发语言·人工智能·语言模型·开源
警醒与鞭策1 天前
Codex桌面版与Claude桌面版使用设置
android·unity·ai·性能优化
传奇开心果1 天前
【Compose Multiplatform跨端声明式UI实用技术】第19课:多平台部署与发布
android·kotlin
红尘伴蝶舞1 天前
加密拦截器让抓包失效,我只能从 4KB 的 logcat 碎片里拼回 JSON
android·kotlin·ai编程
booboosui1 天前
219 个还是 0 个:读不到微信界面时,我只加不删
android
Android打工仔1 天前
Compose 中何时该用 padding,何时该用 offset
android·android jetpack
二流小码农1 天前
HarmonyOS开发助手,0代码让元服务从开发到上架
android·ios·harmonyos