Files
Murine-launcher/docs/Recents布局及上滑流程分析报告.md
T
2026-01-31 23:35:19 +08:00

20 KiB
Raw Blame History

Recents布局及上滑流程分析报告

概述

本报告基于对AOSP Launcher3源码的深入分析,全面解析了Recents(最近任务)界面的布局架构以及从桌面和三方应用上滑进入Recents的完整流程。

源码位置:

  • RecentsView: quickstep/src/com/android/quickstep/views/RecentsView.java
  • TaskView: quickstep/src/com/android/quickstep/views/TaskView.java
  • LauncherSwipeHandlerV2: quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
  • FallbackSwipeHandler: quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
  • SwipeUpAnimationLogic: quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java

Recents布局架构分析

核心组件架构

Recents(最近任务)界面是Android多任务系统的核心,其架构设计高度模块化,主要包含以下核心组件:

1. RecentsView - 最近任务视图容器

RecentsView是继承自PagedView的抽象类,负责:

  • 管理所有TaskView的布局和显示
  • 处理分页滚动逻辑
  • 实现任务切换动画
  • 支持横向/纵向布局适配
public abstract class RecentsView<
        CONTAINER_TYPE extends Context & RecentsViewContainer & StatefulContainer<STATE_TYPE>,
        STATE_TYPE extends BaseState<STATE_TYPE>> extends PagedView implements Insettable,
        HighResLoadingState.HighResLoadingStateChangedCallback,
        TaskVisualsChangeListener {

2. TaskView - 单个任务视图

每个TaskView代表一个运行中的应用程序任务,负责:

  • 显示任务缩略图
  • 处理任务操作(启动、关闭、分屏等)
  • 实现任务动画效果
  • 管理任务菜单

3. RecentsModel - 数据模型层

负责与系统服务交互,管理任务数据:

  • 从ActivityManager获取运行中的任务列表
  • 缓存任务缩略图数据
  • 处理任务状态变化通知

4. RecentsOrientedState - 方向状态管理

管理Recents界面的方向状态:

  • 动态选择Portrait/Landscape方向处理器
  • 处理设备旋转事件
  • 维护方向相关的配置信息

布局层次结构

RecentsView (PagedView)
├── TaskView 1
│   ├── TaskThumbnailView (缩略图)
│   ├── IconView (应用图标)
│   └── TaskMenuView (任务菜单)
├── TaskView 2
├── ClearAllButton (清除所有按钮)
└── OverviewActionsView (概览操作栏)

关键布局特性

1. 分页布局机制

RecentsView继承自PagedView,支持:

  • 水平/垂直分页滚动
  • 惯性滚动效果
  • 边缘回弹效果
  • 无障碍访问支持

2. 方向自适应

通过PagedOrientationHandler实现:

  • 纵向模式:水平分页,X轴为主方向
  • 横向模式:垂直分页,Y轴为主方向
  • 动态方向切换支持

3. 任务布局策略

  • 网格布局:多任务并排显示
  • 全屏布局:单个任务占据全屏
  • 分屏布局:支持Split Screen模式

桌面上滑流程分析

桌面上滑流程涉及从Launcher界面切换到Recents界面的完整动画过程。

核心处理类

1. LauncherSwipeHandlerV2

桌面上滑的主要处理类,继承自AbsSwipeUpHandler:

public class LauncherSwipeHandlerV2 extends AbsSwipeUpHandler<
        QuickstepLauncher, RecentsView<QuickstepLauncher, LauncherState>, LauncherState> {

2. SwipeUpAnimationLogic

上滑动画逻辑的抽象基类,处理:

  • 位移计算和动画进度管理
  • 远程动画目标处理
  • 阻力效果实现

上滑流程详细分析

阶段1:手势检测和初始化

触发条件:用户在桌面从底部向上滑动

关键代码流程:

// LauncherSwipeHandlerV2构造函数
public LauncherSwipeHandlerV2(Context context, TaskAnimationManager taskAnimationManager,
        RecentsAnimationDeviceState deviceState, RotationTouchHelper rotationTouchHelper,
        GestureState gestureState, long touchTimeMs, boolean continuingLastGesture,
        InputConsumerController inputConsumer, MSDLPlayerWrapper msdlPlayerWrapper) {
    super(context, taskAnimationManager, deviceState, rotationTouchHelper, gestureState,
            touchTimeMs, continuingLastGesture, inputConsumer, msdlPlayerWrapper);
}

初始化步骤:

  1. 创建GestureState对象,记录手势状态
  2. 初始化RemoteTargetGluer,准备远程动画目标
  3. 设置输入消费者,拦截后续触摸事件

阶段2:动画准备和远程动画启动

关键方法: onDragStart() 和 onDrag()

// SwipeUpAnimationLogic中的位移更新
@UiThread
public void updateDisplacement(float displacement) {
    // 计算位移和动画进度
    displacement = overrideDisplacementForTransientTaskbar(-displacement);
    mCurrentDisplacement = displacement;

    float shift;
    if (displacement > mTransitionDragLength * mDragLengthFactor && mTransitionDragLength > 0) {
        shift = mDragLengthFactor;
    } else {
        float translation = Math.max(displacement, 0);
        shift = mTransitionDragLength == 0 ? 0 : translation / mTransitionDragLength;
    }

    mCurrentShift.updateValue(shift); // 更新动画进度
}

动画准备过程:

  1. 启动Recents动画:通过SystemUiProxy启动远程动画
  2. 获取运行任务:从ActivityManager获取当前运行的任务信息
  3. 创建任务模拟器:TaskViewSimulator用于动画计算
  4. 设置动画端点:计算过渡距离和阻力参数

阶段3:动画执行和状态同步

阶段4:Home动画工厂创建

桌面上滑特有的Home动画效果:

protected HomeAnimationFactory createHomeAnimationFactory(
        List<IBinder> launchCookies,
        long duration,
        boolean isTargetTranslucent,
        boolean appCanEnterPip,
        RemoteAnimationTarget runningTaskTarget,
        @Nullable TaskView targetTaskView) {
    
    // 查找工作区视图(图标或小部件)
    final View workspaceView = findWorkspaceView(launchCookies, sourceTaskView);
    
    if (workspaceView instanceof LauncherAppWidgetHostView) {
        return createWidgetHomeAnimationFactory((LauncherAppWidgetHostView) workspaceView,
                isTargetTranslucent, runningTaskTarget);
    }
    return createIconHomeAnimationFactory(workspaceView, targetTaskView);
}

Home动画类型:

  1. 图标动画:应用图标飞入热座或工作区
  2. 小部件动画:小部件缩放和位置调整
  3. 浮动图标动画:FloatingIconView实现的 morphing 效果

三方应用界面上滑流程分析

三方应用界面的上滑流程与桌面类似,但处理方式有所不同。

核心处理类:FallbackSwipeHandler

当在非Launcher应用中上滑时使用FallbackSwipeHandler:

public class FallbackSwipeHandler extends AbsSwipeUpHandler<
        FallbackActivityInterface.FallbackActivity, 
        RecentsView<FallbackActivityInterface.FallbackActivity, OverviewState>, 
        OverviewState> {

主要差异点

1. 活动接口不同

  • 桌面:使用QuickstepLauncher和LauncherState
  • 三方应用:使用FallbackActivity和OverviewState

2. 动画起始状态

  • 桌面:从工作区图标开始动画
  • 三方应用:从当前应用窗口开始动画

3. Home动画处理

三方应用上滑时:

  • 没有工作区图标动画
  • 直接切换到Recents界面
  • 动画效果更简单直接

上滑流程对比

特性 桌面上滑 三方应用上滑
处理类 LauncherSwipeHandlerV2 FallbackSwipeHandler
起始状态 Launcher工作区 当前应用窗口
Home动画 图标飞入动画 简单切换动画
状态管理 LauncherState OverviewState
容器接口 QuickstepLauncher FallbackActivity

Recents布局架构图

graph TB
    subgraph "数据层"
        RM[RecentsModel<br/>任务数据管理]
        RTD[RecentTasksRepository<br/>任务仓库]
        RDR[RecentsDeviceProfileRepository<br/>设备配置]
        RRS[RecentsRotationStateRepository<br/>旋转状态]
    end
    
    subgraph "视图层"
        RV[RecentsView<br/>最近任务容器]
        TV1[TaskView 1<br/>任务视图]
        TV2[TaskView 2<br/>任务视图]
        TV3[TaskView 3<br/>任务视图]
        CA[ClearAllButton<br/>清除按钮]
        OV[OverviewActionsView<br/>操作栏]
    end
    
    subgraph "任务组件层"
        TTV[TaskThumbnailView<br/>缩略图]
        TIV[TaskIconView<br/>应用图标]
        TMV[TaskMenuView<br/>任务菜单]
    end
    
    subgraph "状态管理层"
        ROS[RecentsOrientedState<br/>方向状态]
        POH[PagedOrientationHandler<br/>方向处理器]
        DP[DeviceProfile<br/>设备配置]
    end
    
    subgraph "动画层"
        SUAL[SwipeUpAnimationLogic<br/>上滑动画逻辑]
        TVS[TaskViewSimulator<br/>任务模拟器]
        RTH[RemoteTargetHandle<br/>远程目标]
    end
    
    subgraph "手势处理层"
        LSH[LauncherSwipeHandlerV2<br/>桌面上滑处理器]
        FSH[FallbackSwipeHandler<br/>应用上滑处理器]
        GS[GestureState<br/>手势状态]
    end
    
    RM --> RV
    RTD --> RM
    RDR --> ROS
    RRS --> ROS
    
    RV --> TV1
    RV --> TV2
    RV --> TV3
    RV --> CA
    RV --> OV
    
    TV1 --> TTV
    TV1 --> TIV
    TV1 --> TMV
    
    ROS --> POH
    DP --> ROS
    POH --> RV
    
    SUAL --> TVS
    TVS --> RTH
    RTH --> RV
    
    LSH --> SUAL
    FSH --> SUAL
    GS --> LSH
    GS --> FSH
    
    style RM fill:#1e3a8a
    style RV fill:#1e40af
    style TV1 fill:#3730a3
    style TTV fill:#4c1d95
    style ROS fill:#0f766e
    style SUAL fill:#065f46
    style LSH fill:#047857

上滑流程时序图

sequenceDiagram
    participant User as 用户手势
    participant IC as InputConsumer
    participant LSH as LauncherSwipeHandlerV2
    participant SUAL as SwipeUpAnimationLogic
    participant System as 系统服务
    participant RV as RecentsView
    participant RM as RecentsModel

    Note over User, RM: 阶段1: 手势检测和初始化
    User->>IC: TouchEvent(ACTION_DOWN)
    IC->>LSH: onDragStart()
    LSH->>System: startRecentsAnimation()
    System-->>LSH: RemoteAnimationTargets[]
    LSH->>SUAL: initTransitionEndpoints()
    SUAL->>RM: 获取任务数据
    RM-->>SUAL: 任务列表

    Note over User, RM: 阶段2: 动画执行和位移更新
    loop 手势持续
        User->>IC: TouchEvent(ACTION_MOVE)
        IC->>LSH: onDrag(位移, 速度)
        LSH->>SUAL: updateDisplacement(位移)
        SUAL->>SUAL: onCurrentShiftUpdated()
        SUAL->>RV: 更新任务位置/缩放
        RV->>RV: 重绘界面
    end

    Note over User, RM: 阶段3: 手势结束和状态切换
    User->>IC: TouchEvent(ACTION_UP)
    IC->>LSH: onDragEnd(最终速度)
    LSH->>LSH: 判断是否进入Recents
    alt 进入Recents (速度/位移达标)
        LSH->>System: finishRecentsAnimation()
        LSH->>RV: 完成进入动画
        LSH->>RV: 切换到OVERVIEW状态
        RV->>RV: 显示完整Recents界面
    else 返回桌面 (未达标)
        LSH->>LSH: 执行回弹动画
        LSH->>System: cancelRecentsAnimation()
        LSH->>RV: 恢复到NORMAL状态
    end

    Note over User, RM: 阶段4: 清理和状态同步
    LSH->>IC: 释放输入消费者
    LSH->>System: 清理动画资源
    System-->>LSH: 动画完成确认

桌面上滑 vs 三方应用上滑详细对比时序图

桌面上滑详细流程(LauncherSwipeHandlerV2)

sequenceDiagram
    participant User as 用户手势
    participant IC as InputConsumer
    participant LSH as LauncherSwipeHandlerV2
    participant SUAL as SwipeUpAnimationLogic
    participant System as 系统服务
    participant HA as HomeAnimationFactory
    participant RV as RecentsView
    participant DP as DeviceProfile

    Note over User, DP: 阶段1: 手势检测和初始化
    User->>IC: TouchEvent(ACTION_DOWN)
    IC->>LSH: onDragStart()
    LSH->>System: startRecentsAnimation()
    System-->>LSH: RemoteAnimationTargets[]
    LSH->>DP: 获取设备配置
    DP-->>LSH: DeviceProfile对象
    LSH->>SUAL: initTransitionEndpoints(DP)
    SUAL->>SUAL: 计算过渡距离和阻力参数
    
    Note over User, DP: 阶段2: Home动画工厂创建
    LSH->>LSH: findWorkspaceView()
    alt 找到工作区图标
        LSH->>HA: createIconHomeAnimationFactory()
        HA->>HA: 创建FloatingIconView
        HA->>HA: 设置图标位置和动画参数
    else 找到小部件
        LSH->>HA: createWidgetHomeAnimationFactory()
        HA->>HA: 创建FloatingWidgetView
        HA->>HA: 设置小部件动画参数
    else 无合适视图
        LSH->>HA: new LauncherHomeAnimationFactory()
        HA->>HA: 创建简单动画工厂
    end
    
    Note over User, DP: 阶段3: 动画执行和位移更新
    loop 手势持续 (ACTION_MOVE)
        User->>IC: TouchEvent(位移, 速度)
        IC->>LSH: onDrag()
        LSH->>SUAL: updateDisplacement(位移)
        SUAL->>SUAL: onCurrentShiftUpdated()
        SUAL->>HA: update()
        HA->>HA: 更新图标/小部件位置和透明度
        SUAL->>RV: 更新任务位置和缩放
        RV->>RV: 重绘界面
    end
    
    Note over User, DP: 阶段4: 手势结束和状态切换
    User->>IC: TouchEvent(ACTION_UP)
    IC->>LSH: onDragEnd(最终速度)
    LSH->>LSH: 判断是否进入Recents
    alt 进入Recents (速度/位移达标)
        LSH->>System: finishRecentsAnimation()
        LSH->>HA: 完成Home动画
        HA->>HA: 执行图标飞入动画
        LSH->>RV: 切换到OVERVIEW状态
        RV->>RV: 显示完整Recents界面
    else 返回桌面 (未达标)
        LSH->>LSH: 执行回弹动画
        LSH->>System: cancelRecentsAnimation()
        LSH->>RV: 恢复到NORMAL状态
    end
    
    Note over User, DP: 阶段5: 清理资源
    LSH->>IC: 释放输入消费者
    LSH->>System: 清理动画资源
    System-->>LSH: 动画完成确认

三方应用上滑详细流程(FallbackSwipeHandler)

sequenceDiagram
    participant User as 用户手势
    participant IC as InputConsumer
    participant FSH as FallbackSwipeHandler
    participant SUAL as SwipeUpAnimationLogic
    participant System as 系统服务
    participant HA as FallbackHomeAnimationFactory
    participant RV as FallbackRecentsView
    participant DP as DeviceProfile
    participant AM as ActivityManager

    Note over User, AM: 阶段1: 手势检测和初始化
    User->>IC: TouchEvent(ACTION_DOWN)
    IC->>FSH: onDragStart()
    FSH->>System: startRecentsAnimation()
    System-->>FSH: RemoteAnimationTargets[]
    FSH->>DP: 获取设备配置
    DP-->>FSH: DeviceProfile对象
    FSH->>SUAL: initTransitionEndpoints(DP)
    SUAL->>SUAL: 计算过渡距离和阻力参数
    
    Note over User, AM: 阶段2: 检查是否运行在Home上
    FSH->>FSH: mRunningOverHome检查
    alt 运行在Home应用上
        FSH->>FSH: 设置Home Builder Proxy
        FSH->>FSH: updateHomeActivityTransformDuringSwipeUp()
    else 运行在三方应用上
        FSH->>FSH: 标准动画处理
    end
    
    Note over User, AM: 阶段3: Home动画工厂创建
    FSH->>FSH: 检查是否支持PIP
    alt 应用支持PIP
        FSH->>HA: new FallbackPipToHomeAnimationFactory()
        HA->>HA: 设置PIP动画参数
    else 标准动画
        FSH->>HA: new FallbackHomeAnimationFactory()
        HA->>HA: 设置标准动画参数
        FSH->>AM: startHomeIntent()
        AM-->>FSH: 启动Home Activity
    end
    
    Note over User, AM: 阶段4: 动画执行和位移更新
    loop 手势持续 (ACTION_MOVE)
        User->>IC: TouchEvent(位移, 速度)
        IC->>FSH: onDrag()
        FSH->>SUAL: updateDisplacement(位移)
        SUAL->>SUAL: onCurrentShiftUpdated()
        alt 运行在Home上
            FSH->>FSH: setHomeScaleAndAlpha()
            FSH->>FSH: 更新Home窗口缩放和透明度
        end
        SUAL->>RV: 更新任务位置和缩放
        RV->>RV: 重绘界面
    end
    
    Note over User, AM: 阶段5: 手势结束和状态切换
    User->>IC: TouchEvent(ACTION_UP)
    IC->>FSH: onDragEnd(最终速度)
    FSH->>FSH: 判断是否进入Recents
    alt 进入Recents (速度/位移达标)
        FSH->>System: finishRecentsAnimation()
        FSH->>HA: 完成动画
        FSH->>RV: 切换到OVERVIEW状态
        RV->>RV: 显示完整Recents界面
    else 返回应用 (未达标)
        FSH->>FSH: 执行回弹动画
        FSH->>System: cancelRecentsAnimation()
        FSH->>RV: 恢复到应用状态
    end
    
    Note over User, AM: 阶段6: 清理资源
    FSH->>IC: 释放输入消费者
    FSH->>System: 清理动画资源
    System-->>FSH: 动画完成确认

关键差异对比分析

处理阶段 LauncherSwipeHandlerV2 (桌面) FallbackSwipeHandler (三方应用)
动画工厂创建 createIconHomeAnimationFactory()
createWidgetHomeAnimationFactory()
new FallbackHomeAnimationFactory()
new FallbackPipToHomeAnimationFactory()
Home动画类型 FloatingIconView图标飞入
FloatingWidgetView小部件动画
简单窗口缩放动画
PIP进入动画
工作区视图查找 findWorkspaceView()查找图标/小部件 无工作区视图查找逻辑
Home状态处理 无特殊Home状态处理 mRunningOverHome检查
updateHomeActivityTransformDuringSwipeUp()
Home启动方式 无需额外启动Home startHomeIntent()启动Home Activity
动画复杂度 复杂的图标morphing效果 简单的窗口缩放效果
状态切换 LauncherState.NORMAL ↔ OVERVIEW RecentsState.APP ↔ OVERVIEW
容器类型 QuickstepLauncher FallbackActivity
视图类型 RecentsView FallbackRecentsView

核心发现总结

1. Recents布局架构特点

模块化分层设计:

  • 数据层:RecentsModel负责任务数据管理
  • 视图层:RecentsView作为容器,TaskView作为任务单元
  • 状态层:RecentsOrientedState管理方向状态
  • 动画层:SwipeUpAnimationLogic处理动画逻辑
  • 手势层:不同的SwipeHandler处理不同场景

关键技术特性:

  • 方向自适应:通过PagedOrientationHandler实现横竖屏适配
  • 分页布局:继承PagedView支持平滑滚动
  • 远程动画:与系统服务协作实现无缝过渡
  • 状态管理:完善的状态机管理界面切换

2. 桌面上滑流程核心机制

四阶段处理流程:

  1. 手势检测:InputConsumer拦截触摸事件
  2. 动画准备:启动远程动画,获取任务数据
  3. 动画执行:实时更新位移,同步界面状态
  4. 状态切换:根据手势结果决定最终状态

特色功能:

  • Home动画:图标飞入效果,提升用户体验
  • 阻力效果:物理模拟的滚动阻力
  • 无缝过渡:与系统动画服务深度集成

3. 三方应用上滑差异

主要区别:

  • 处理类不同:FallbackSwipeHandler vs LauncherSwipeHandlerV2
  • 动画简化:没有复杂的Home动画效果
  • 状态管理:使用OverviewState而非LauncherState

架构设计优势

  1. 高度解耦:各层职责清晰,便于维护和扩展
  2. 性能优化:异步数据加载,避免主线程阻塞
  3. 可扩展性:支持新的布局模式和动画效果
  4. 一致性:统一的接口设计保证行为一致

实际应用价值

这种架构设计为Android多任务系统提供了:

  • 流畅的用户体验:无缝的任务切换动画
  • 灵活的方向适配:自动适应设备方向变化
  • 强大的扩展能力:支持分屏、画中画等高级功能
  • 稳定的性能表现:优化的内存管理和动画性能

该分析为理解Android多任务系统的内部机制提供了深入的技术视角,对于系统定制、性能优化和功能扩展具有重要参考价值。


文档版本: 1.0
分析时间: 2026-01-29
源码版本: Android16 QPR2 Release