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;

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

相关推荐
天空之城--12 小时前
Android逆向安全合规接单指南
android·安全
消失的旧时光-194313 小时前
Android 系统层扫盲 09:AMS、ATMS、WMS、PMS 到底分别管什么?
android·wms·pms·ams·aosp·atms
Godikov14 小时前
Android 系统级设备应用踩坑实录:sharedUserId 签名、SDK 授权失败 -4、开机自启与 U 盘 OTA 升级
android
IT毕设实战小研17 小时前
基于大数据的国内主要农作物产量趋势分析与可视化
android·java·大数据·django·课程设计
企业数字化笔记18 小时前
固定资产历史数据怎么导入系统?Excel模板、字段映射和数据校验
android·java·数据库·后端
龙之叶18 小时前
Android出海系列-GMS认证介绍
android
潮族大Z18 小时前
Android性能优化:启动、内存、卡顿的一站式排查手册
android
事圆则缓20 小时前
从suspend字节码到 Retrofit 协程桥:挂起函数识别与恢复
android·retrofit
杉氧21 小时前
RN 性能调优指南:重渲染(Re-renders)控制与长列表(FlatList)优化
android·前端·react native
Coffeeee21 小时前
claude-video 一个让你的Agent拥有看视频能力的Skill
android·人工智能·aigc