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
- 修改
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> -->
- 修改
launcher3/src/main/res/layout/launcher.xml
文件:
- 隐藏 Launcher 中 Hotseat 布局
- 通过 1 和 2 的修改 Hotseat 区不再展示
xml
<include
id="@+id/hotseat"
layout="@layout/hotseat"
android:visibility="gone" />
- 修改
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);
...
- 修改
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;
}
...
}
- 修改
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
- 修改
launcher3/src/main/java/com/android/launcher3/DeleteDropTarget.java
:
supportsDrop
方法返回isDropTargetBarEnable
,控制是否展示 DeleteDropTarget:
java
@Override
protected boolean supportsDrop(ItemInfo info) {
return LauncherFeatureConfig.isDropTargetBarEnable;
}
- 修改
launcher3/src/main/java/com/android/launcher3/SecondaryDropTarget.java
:
supportsDrop
方法返回isDropTargetBarEnable
,控制是否展示 SecondaryDropTarget:
java
@Override
protected boolean supportsDrop(ItemInfo info) {
return LauncherFeatureConfig.isDropTargetBarEnable;
}
禁用上滑桌面展示 AllApps 弹窗
- 修改
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;
}
禁用长按桌面展示选项菜单
- 修改
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 展示选项菜单
- 修改
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;
}
禁用拖拽时桌面显示半透明遮罩
- 修改
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 时目标位预览框
- 修改
launcher3/src/main/java/com/android/launcher3/CellLayout.java
:
mVisualizeDropLocation
变量的值设为isAppDropLocationVisible
java
private boolean mVisualizeDropLocation = LauncherFeatureConfig.isAppDropLocationVisible;
上面这些步骤做完,就可以获得一个干净的桌面了,下面往桌面添加所有应用图标。