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;

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

相关推荐
Dovis(誓平步青云)24 分钟前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码2 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓7 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1238 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium