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;

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

相关推荐
zhangphil3 小时前
HARDWARE 属性的Bitmap与普通Bitmap,GPU与RenderThread渲染与处理方式异同比较,Android
android
消失的旧时光-19435 小时前
Flutter 异步编程:Future 与 Stream 深度解析
android·前端·flutter
alexhilton6 小时前
Compose CameraX现已稳定:给Composer的端到端指南
android·kotlin·android jetpack
阿里云云原生7 小时前
移动端性能监控探索:可观测 Android 采集探针架构与实现
android
雨白8 小时前
玩转 Flow 操作符(一):数据转换与过滤
android·kotlin
二流小码农8 小时前
鸿蒙开发:web页面如何适配深色模式
android·ios·harmonyos
消失的旧时光-194310 小时前
TCP 流通信中的 EOFException 与 JSON 半包问题解析
android·json·tcp·数据
JiaoJunfeng10 小时前
android 8以上桌面图标适配方案(圆形)
android·图标适配
参宿四南河三10 小时前
Android Compose快速入门手册(真的只是入门)
android·app
芦半山11 小时前
Looper究竟在等什么?
android