Launcher3 to Launchpad 01 布局修改
禁用相关布局 Todo list:
- 禁用首页搜索框
- 禁用 Hotseat
- 禁用 DropTargetBar
- 禁用上滑桌面展示 AllApps 弹窗
- 禁用长按桌面展示选项菜单
- 禁用长按 App 展示选项菜单
- 禁用拖拽时桌面显示半透明遮罩
- 禁用拖拽时桌面显示 App 目标位预览框
定义全局功能控制开关
- 在
FeatureFlags
中添加如下全局功能控制开关:
public final class FeatureFlags {
public static final BooleanFlag ENABLE_HOTSEAT = getDebugFlag(
"ENABLE_HOTSEAT", false,
"Show bottom Hotseat area in the launcher");
public static final BooleanFlag ENABLE_DROP_TARGET_BAR = getDebugFlag(
"ENABLE_DROP_TARGET_BAR", false,
"Show top DropTargetBar in the launcher");
public static final BooleanFlag ENABLE_APP_OPTIONS_POPUP = getDebugFlag(
"ENABLE_APP_OPTIONS_POPUP", false,
"Show app long press options popup in the workspace");
public static final BooleanFlag ENABLE_WORKSPACE_OPTIONS_POPUP = getDebugFlag(
"ENABLE_WORKSPACE_OPTIONS_POPUP", false,
"Show long press empty area options popup in the workspace");
public static final BooleanFlag ENABLE_ALL_APPS_SHEET = getDebugFlag(
"ENABLE_ALL_APPS_SHEET", false,
"Show swipe up all apps sheet in the workspace");
public static final BooleanFlag ENABLE_WORKSPACE_DRAGGING_BACKGROUND = getDebugFlag(
"ENABLE_WORKSPACE_DRAGGING_BACKGROUND", false,
"Show dragging background in the workspace");
public static final BooleanFlag ENABLE_APP_DROP_LOCATION_PREVIEW = getDebugFlag(
"ENABLE_APP_DROP_LOCATION_PREVIEW", false,
"Show app drop location preview in the workspace");
}
禁用相关布局
禁用搜索按钮
在 launcher3
目录下的 build.gradle
文件中找到 QSB_ON_FIRST_SCREEN
, 将其值设为 false:
buildConfigField("boolean", "QSB_ON_FIRST_SCREEN", "false")
禁用 Hotseat
- 修改
default_workspace_axb.xml
:
launcher:container=-101
表示容器为 Hotseat,清空所有相关配置
<!-- 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> -->
- 修改
launcher3/src/main/res/layout/launcher.xml
文件:
- 隐藏 Launcher 中 Hotseat 布局
- 通过 1 和 2 的修改 Hotseat 区不在展示
<include
id="@+id/hotseat"
layout="@layout/hotseat"
android:visibility="gone" />
- 修改
launcher3/src/main/java/com/android/launcher3/DeviceProfile.java
- 将 Hotseat 区尺寸置为 0
private void updateHotseatIconSize(int hotseatIconSizePx) {
// Resize Hotseat area
if (!FeatureFlags.ENABLE_HOTSEAT.get()) {
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);
...
- 修改
launcher3/src/main/java/com/android/launcher3/Hotseat.java
- Hotseat 区不响应手势事件
@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 (!FeatureFlags.ENABLE_HOTSEAT.get()) {
return false;
}
...
}
- 修改
launcher3/src/main/java/com/android/launcher3/Workspace.java
- Hotseat 区不响应创建文件夹
boolean createUserFolderIfNecessary(View newView, int container, CellLayout target,
int[] targetCell, float distance, boolean external, DragObject d) {
// Block HotSeat to create folder
if (!FeatureFlags.ENABLE_HOTSEAT.get() && 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 (!FeatureFlags.ENABLE_HOTSEAT.get()) {
boolean isHotseat = mLauncher.isHotseatLayout(mDragTargetLayout);
userFolderPending = !isHotseat && userFolderPending;
}
if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
...
}
...
}
禁用 DropTargetBar
- 修改
launcher3/src/main/java/com/android/launcher3/DeleteDropTarget.java
:
supportsDrop
方法返回ENABLE_DROP_TARGET_BAR
,控制是否展示 DeleteDropTarget:
@Override
protected boolean supportsDrop(ItemInfo info) {
return FeatureFlags.ENABLE_DROP_TARGET_BAR.get();
}
- 修改
launcher3/src/main/java/com/android/launcher3/SecondaryDropTarget.java
:
supportsDrop
方法返回ENABLE_DROP_TARGET_BAR
,控制是否展示 SecondaryDropTarget:
@Override
protected boolean supportsDrop(ItemInfo info) {
return FeatureFlags.ENABLE_DROP_TARGET_BAR.get();
}
禁用上滑桌面展示 AllApps 弹窗
- 修改
launcher3/src/main/java/com/android/launcher3/touch/AllAppsSwipeController.java
:
canInterceptTouch
方法返回false
,控制不响应上滑事件
@Override
protected boolean canInterceptTouch(MotionEvent ev) {
// Disable AllAppsSheet
if (!FeatureFlags.ENABLE_ALL_APPS_SHEET.get()) {
return false;
}
if (mCurrentAnimation != null) {
// If we are already animating from a previous state, we can intercept.
return true;
}
禁用长按桌面展示选项菜单
- 修改
launcher3/src/main/java/com/android/launcher3/touch/WorkspaceTouchListener.java
:
onLongPress
方法中添加判断,控制不展示长按菜单
@Override
public boolean onLongPress(MotionEvent ev) {
...
if (FeatureFlags.ENABLE_WORKSPACE_OPTIONS_POPUP.get()) {
mLauncher.showDefaultOptions(mTouchDownPoint.x, mTouchDownPoint.y);
}
...
}
禁用长按 App 展示选项菜单
- 修改
launcher3/src/main/java/com/android/launcher3/BubbleTextView.java
:
startLongPressAction
方法中添加判断,控制不展示长按菜单
public PreDragCondition startLongPressAction() {
// Disable app long press popup
if (!FeatureFlags.ENABLE_APP_OPTIONS_POPUP.get()) {
return null;
}
PopupContainerWithArrow popup = PopupContainerWithArrow.showForIcon(this);
return popup != null ? popup.createPreDragCondition(true) : null;
}
禁用拖拽时桌面显示半透明遮罩
- 修改
launcher3/src/main/java/com/android/launcher3/Workspace.java
:
onDragStart
方法中添加判断,控制不展示半透明遮罩
@Override
public void onDragStart(DragObject dragObject, DragOptions options) {
...
if (FeatureFlags.ENABLE_WORKSPACE_DRAGGING_BACKGROUND.get()) {
// Always enter the spring loaded mode
mLauncher.getStateManager().goToState(SPRING_LOADED);
}
...
}
禁用拖拽 App 时目标位预览框
- 修改
launcher3/src/main/java/com/android/launcher3/CellLayout.java
:
mVisualizeDropLocation
变量的值设为ENABLE_APP_DROP_LOCATION_PREVIEW
private boolean mVisualizeDropLocation = FeatureFlags.ENABLE_APP_DROP_LOCATION_PREVIEW.get();
上面这些步骤做完,就可以获得一个干净的桌面了,下面往桌面添加所有应用图标。