当前位置: 首页 > news >正文

AOSP14 Launcher3——手势上滑关键类AbsSwipeHandler解析

我们来深入分析 quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java 这个非常核心且复杂的类。

1. 核心作用 (Core Role):

AbsSwipeUpHandler 是 Quickstep (Launcher3 的手势导航实现) 中处理从屏幕底部上滑手势的核心逻辑抽象基类。它负责管理从手势开始到结束的整个流程,包括:

  • 手势识别与处理: 接收原始触摸事件,计算滑动距离、速度和方向。
  • 窗口动画控制: 连接并控制由 SystemUI 提供的 RecentsAnimationController,通过操作应用窗口和 Launcher 窗口的 Surface (Leash),实现平滑的过渡动画(应用 <-> Launcher/概览)。
  • 界面状态同步: 协调 Launcher UI 元素(如 Workspace、Hotseat、RecentsView)的状态和动画,使其与手势进度和窗口动画保持同步。
  • 目标状态决策: 根据手势的速度、距离、暂停状态以及用户在 RecentsView 中的交互,计算手势的最终目标(GestureEndTarget):返回桌面 (HOME)、进入概览/最近任务 (RECENTS)、切换到上一个应用 (LAST_TASK)、切换到新任务 (NEW_TASK) 或进入所有应用列表 (ALL_APPS)。
  • 动画执行与收尾: 启动并管理过渡到最终目标状态的动画,并在动画结束后释放资源、完成任务切换或返回桌面。
  • 处理特殊情况: 如 PiP (画中画) 窗口的特殊动画、分屏模式、Taskbar 交互等。

简单来说,它是连接用户上滑手势输入、系统窗口动画控制以及 Launcher UI 状态变化的总指挥

2. 如何协调其他类 (Coordination):

AbsSwipeUpHandler 像一个交响乐指挥,协调多个组件共同完成复杂的动画和状态切换:

  • GestureState:
    • 提供者: 外部(如 TouchInteractionService)创建并传入。
    • 交互: AbsSwipeUpHandlerGestureState 读取手势信息(起始点、当前运行任务、速度、是否暂停等),并将计算出的最终目标 (endTarget) 写回 GestureState
  • RecentsAnimationController & RecentsAnimationTargets:
    • 提供者: 由 SystemUI (WindowManager) 在手势开始时通过 onRecentsAnimationStart 回调提供。
    • 交互: AbsSwipeUpHandler 使用 RecentsAnimationController 来:
      • 获取和控制应用/Launcher 窗口的 Surface Leash。
      • 截取任务快照 (screenshotTask)。
      • 设置 SystemUI 标志(如状态栏/导航栏外观)。
      • 最终结束动画 (finish()),将控制权交还给系统。
    • RecentsAnimationTargets 提供了动画目标的详细信息(如 TaskInfo, Leash, 初始位置等)。
  • TaskViewSimulator & RemoteTargetHandle & RemoteTargetGluer:
    • 交互: AbsSwipeUpHandler 通过 RemoteTargetGluerRecentsAnimationTargets 分配给一个或多个 RemoteTargetHandle。每个 RemoteTargetHandle 包含一个 TaskViewSimulator
    • TaskViewSimulator 至关重要,它负责计算应用窗口 Leash 的变换(Translation, Scale, Alpha, Crop, Corner Radius)。AbsSwipeUpHandlerapplyScrollAndTransform 方法中,根据当前手势进度 (mCurrentShift.value) 和 RecentsView 的滚动偏移,更新 TaskViewSimulator 的状态,并应用这些变换到实际的 Surface Leash 上。
  • StatefulActivity (e.g., QuickstepLauncher) & BaseActivityInterface:
    • 交互: 通过 mActivityInterface 与 Launcher Activity 交互:
      • 获取 Activity 实例 (getCreatedActivity())。
      • 获取核心 UI 组件,特别是 RecentsView (getOverviewPanel())。
      • 准备 Recents UI (prepareRecentsUI),这通常会返回一个 AnimationFactory,用于创建 Launcher 内部元素的动画控制器 (mLauncherTransitionController)。
      • 通知 Activity 手势结束并即将返回桌面 (onSwipeUpToHomeComplete) 或切换任务失败 (onLaunchTaskFailed)。
      • 获取 DeviceProfile 和其他配置信息。
  • RecentsView (e.g., LauncherRecentsView):
    • 交互:
      • 在手势开始时通知 RecentsView (onGestureAnimationStart),让它可以准备任务卡片。
      • 链接滚动事件 (linkRecentsViewScroll, mOnRecentsScrollListener):当 RecentsView 滚动时,会触发 onRecentsViewScroll,进而调用 applyScrollAndTransform 来更新应用窗口的位置,实现窗口跟随卡片滚动的效果。
      • 获取当前/目标页面 (getCurrentPage, getNextPage) 和对应的 TaskView,用于判断手势目标和启动任务。
      • 在手势结束动画开始时,让 RecentsView 参与动画 (onPrepareGestureEndAnimation)。
      • 在手势结束动画完成后,通知 RecentsView (onSwipeUpAnimationSuccessonGestureAnimationEnd)。
      • 更新任务缩略图 (updateThumbnail)。
  • MultiStateCallback (mStateCallback):
    • 作用: 这是 AbsSwipeUpHandler 内部管理异步流程的关键机制。手势涉及多个异步事件(Launcher 启动、绘制完成、动画控制器接收、截图完成、手势完成等)。mStateCallback 定义了一系列状态标志 (STATE_*)。
    • 交互: 通过 mStateCallback.setStateOnUiThread() 设置状态,通过 mStateCallback.runOnceAtState(STATE_FLAGS, runnable) 注册回调。只有当所有指定的状态标志位都变为 1 时,对应的 runnable 才会被执行。这确保了操作在正确的时机发生,避免了复杂的嵌套回调和竞态条件。
  • AnimatorControllerWithResistance (mLauncherTransitionController):
    • 作用: 控制 Launcher 内部 UI 元素的动画(例如 Hotseat 的淡出、Workspace 的缩放)。
    • 交互:AnimationFactory (通过 mActivityInterface.prepareRecentsUI 获得) 创建。AbsSwipeUpHandleronCurrentShiftUpdated 中根据手势进度 (mCurrentShift.value) 更新这个控制器的进度,驱动 Launcher UI 的过渡效果。
  • HomeAnimationFactory (由子类实现):
    • 作用: 定义了当手势目标是 HOME 时,窗口如何具体地动画到桌面上(例如,缩小到图标、缩小到小部件、或者仅仅是淡出)。
    • 交互: AbsSwipeUpHandler 在确定目标是 HOME 时,会调用子类实现的 createHomeAnimationFactory 来获取具体的动画逻辑,并执行它。
  • InputConsumerProxy:
    • 作用: 在手势进行到特定阶段(例如,确定要进入 Launcher 状态时)启用,拦截原本会传递给下方应用窗口的触摸事件,确保手势能继续控制 Launcher UI。

3. 手势与最近任务动画流程示例 (Simplified Flow):

  1. 手势开始: 用户从底部上滑。TouchInteractionService 检测到手势,创建 AbsSwipeUpHandler 实例。
  2. 系统动画启动: SystemUI 启动 Recents 动画,调用 onRecentsAnimationStart,提供 controllertargets
  3. Launcher 准备: AbsSwipeUpHandler 通过 mActivityInitListener 等待 Launcher Activity (mActivity) 准备好。onActivityInit 获取 mRecentsView 引用。prepareRecentsUI 被调用,mLauncherTransitionController 被创建。
  4. 手势进行中:
    • 用户手指移动,updateDisplacement 计算出手势进度 mCurrentShift.value
    • onCurrentShiftUpdated 被调用。
    • applyScrollAndTransform 使用 TaskViewSimulator 更新应用窗口 Leash 的变换(缩放、平移等)。
    • mLauncherTransitionController.setProgress 更新 Launcher 内部 UI 动画。
    • 如果用户在 RecentsView 上左右滑动,onRecentsViewScroll 会触发,同样调用 applyScrollAndTransform 使窗口跟随移动。
  5. 手势结束: 用户抬起手指。onGestureEnded 被调用。
  6. 目标计算: calculateEndTarget 根据速度、位置、是否暂停等因素,决定最终去向(HOME, RECENTS, LAST_TASK 等)。
  7. 结束动画:
    • handleNormalGestureEnd -> animateToProgressInternal 启动收尾动画。
    • 去 HOME: 调用 createHomeAnimationFactory,启动特定的回家动画(可能是 RectFSpringAnim 驱动窗口缩小到图标/小部件)。
    • 去 RECENTS/LAST_TASK: 启动 ValueAnimator 平滑过渡 mCurrentShift.value 到 0 或 1,同时可能驱动 RecentsView 滚动到目标页面。
  8. 动画完成 & 状态同步: 动画结束监听器触发 onSettledOnEndTarget
  9. 最终操作: 根据 endTarget
    • HOME/RECENTS: 调用 mRecentsAnimationController.finish(true/false, ...) 通知系统结束动画,释放 Leash 控制。
    • LAST_TASK: 调用 mRecentsAnimationController.finish(false, ...) 恢复上一个任务。
    • NEW_TASK: 调用 startNewTask 启动 RecentsView 中选中的任务。
  10. 清理: reset 被调用,清理状态和监听器,准备下一次手势。

AbsSwipeUpHandler 通过精密的事件监听、状态管理和对系统动画 API 及 Launcher 内部组件的协调,实现了复杂而流畅的手势导航体验。它的抽象设计允许子类(如 LauncherSwipeHandlerV2)定制特定的回家动画逻辑。

相关文章:

  • NDT和ICP构建点云地图 |【点云建图、Ubuntu、ROS】
  • 【特权FPGA】之UART串口
  • ZYNQ笔记书签
  • 高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第三章微分中值定理与导数的应用同步测试卷 A 卷
  • Blender安装基础使用教程
  • 仓储物流园区可视化平台,推动物流高效运转
  • Android 14 、15动态申请读写权限实现 (Java)
  • spark RDD相关概念和运行架构
  • 软件架构评估利器:质量效用树全解析
  • KWDB创作者计划—KWDB多副本集群保姆级部署
  • QT 老版本下载地址被禁 如何下载
  • YOLO检测目标后实现距离测量
  • 清华大学:VR交通场景下行人避让车辆行为研究
  • 2019年计算机真题
  • 数据集 | 沥青路面缺陷目标检测
  • C++语言程序设计——02 变量与数据类型
  • 构建灵活的接口抽象层:支持多种后端数据存取的实战指南
  • [250412] OpenSSH 10.0 发布,移除DSA算法,sshd默认禁用有限域DH,并分离认证代码
  • Koordinator-nodeMetricController
  • 消息中间件篇——RabbitMQ,Kafka
  • 教育app定制开发/金阊seo网站优化软件
  • 韶山网站建设/网络营销策划书应该怎么写
  • 海淀高端网站建设/长沙本地推广平台
  • 在百度怎么申请自己的网站/专业的seo搜索引擎优化培训
  • 网站做成app客户端/软文营销是什么意思
  • 长春网站优化公司/最热门的短期培训课程