概述
初识launcher3源码,可以发现有个最重要的Activity,即Launcher.java
重要组成部分
- Workspace 工作区
- 工作区是一个带有墙纸和有限页数的广阔区域。每个页面都包含许多用户可以与之交互的图标、文件夹或小部件。工作空间仅用于固定宽度。
- CellLayout 单元格布局
- Workspace中显示多页,每一页就是一个CellLayout。
- Hotseat 热门位置
- 受欢迎的位置,即为桌面底部常驻的快捷建布局
- DragLayer 拖动层
- 一个用来负责分发事件的ViewGroup
- DragController:拖动控制器
- DragLayer只是一个ViewGroup,具体的拖拽的处理都放到了DragController中。
- Srim 幕布
- 一个容易被忽略的幕布view,但在不同状态间切换却扮演着遮挡布局作用
- QsbWidget QuickSearchBarWidget 快速搜索栏小部件
- 显示在workspace的第一页CellLayout 顶部的搜索栏
Launcher 主要继承关系
事件处理组成部分
在正式看事件分发(后续文章)之前,我们先来看下,事件处理组成部分都有哪些类
- 从
launcher.xml
主布局中可以看到根view是LauncherRootView
,但这个View并没有重写任何事件方法,即不做事件分发与拦截 - 接下来引入的是
DragLayer
,实际上是一个FrameLayout
- 而
DragLayer
这个类采用组合引入的方式,将事件交给了TouchController
- 我们从代码中找到到 Launcher 在启动的时候会添加四个
TouchController
path:com.android.launcher3.uioverrides.QuickstepLauncher#createTouchControllers
@Override
public TouchController[] createTouchControllers() {
Mode mode = SysUINavigationMode.getMode(this);
ArrayList<TouchController> list = new ArrayList<>();
list.add(getDragController());
switch (mode) {
case NO_BUTTON:
list.add(new NoButtonQuickSwitchTouchController(this));
list.add(new NavBarToHomeTouchController(this));
list.add(new NoButtonNavbarToOverviewTouchController(this));
break;
case TWO_BUTTONS:
list.add(new TwoButtonNavbarTouchController(this));
list.add(getDeviceProfile().isVerticalBarLayout()
? new TransposedQuickSwitchTouchController(this)
: new QuickSwitchTouchController(this));
list.add(new PortraitStatesTouchController(this));
break;
case THREE_BUTTONS:
default:
list.add(new PortraitStatesTouchController(this));
}
if (!getDeviceProfile().isMultiWindowMode) {
list.add(new StatusBarTouchController(this));
}
list.add(new LauncherTaskViewController(this));
return list.toArray(new TouchController[list.size()]);
}
实际上会添加四个controoler
LauncherDragController
PortraitStatesTouchController
StatusBarTouchController
LauncherTaskViewController