AOSP 14 Launcher3 - Taskbar UI 组成

目录

  1. 整体架构
  2. View层级结构
  3. TaskbarView详细组成
  4. Controller层级
  5. 交互流程
  6. 尺寸与布局

1. 整体架构

1.1 三层架构图

Controller层
View层
Window层
控制
控制
协调
协调
控制
控制
TaskbarViewController
StashedHandleViewController
TaskbarStashController
NavbarButtonsViewController
TaskbarDragLayerController
TaskbarDragLayer
顶层容器
TaskbarView
主要内容区
StashedHandleView
收起时的Handle
TaskbarScrimView
背景遮罩
导航按钮区域
Window Manager
TYPE_NAVIGATION_BAR_PANEL

1.2 屏幕显示效果(Unstashed状态)

┌─────────────────────────────────────────────┐
│                                             │
│          应用内容区域                        │
│                                             │
│                                             │
│                                             │
├─────────────────────────────────────────────┤ ← 应用与Taskbar分界线
│  🔍  📱  📧  🌐  📷  🎵  ⚙️  [≡]           │ ← TaskbarView (80dp高)
│                                    ⬆️ 🏠 ◼️  │ ← 导航按钮
└─────────────────────────────────────────────┘
  ↑    ↑   ↑   ↑   ↑   ↑   ↑    ↑
  QSB  应用图标(Hotseat)         AllApps按钮

1.3 屏幕显示效果(Stashed状态)

┌─────────────────────────────────────────────┐
│                                             │
│          应用内容区域                        │
│          (使用全屏)                          │
│                                             │
│                                             │
│                                    ⬆️ 🏠 ◼️  │ ← 导航按钮
├─────────────────────────────────────────────┤
│           ━━━━━━━━━━━                       │ ← StashedHandleView (24dp高)
└─────────────────────────────────────────────┘
              ↑
         Handle (可点击唤起)

2. View层级结构

2.1 完整View树

graph TB
    Root[TaskbarDragLayer<br/>FrameLayout<br/>全屏容器]
    
    Root --> TaskbarView[TaskbarView<br/>FrameLayout<br/>图标容器]
    Root --> StashedHandle[StashedHandleView<br/>ImageView<br/>收起Handle]
    Root --> TaskbarScrim[TaskbarScrimView<br/>View<br/>背景遮罩]
    Root --> NavFrame[FrameLayout<br/>导航按钮容器]
    
    TaskbarView --> Icons[App Icons<br/>BubbleTextView × N<br/>应用图标]
    TaskbarView --> AllApps[AllAppsButton<br/>ImageView<br/>所有应用按钮]
    TaskbarView --> QSB[QSB Container<br/>FrameLayout<br/>搜索栏]
    TaskbarView --> Folder[FolderIcon<br/>文件夹图标]
    
    NavFrame --> Back[Back Button<br/>返回]
    NavFrame --> Home[Home Button<br/>主页]
    NavFrame --> Recent[Recent Button<br/>最近任务]
    
    style Root fill:#E1F5FE
    style TaskbarView fill:#C8E6C9
    style StashedHandle fill:#FFCCBC
    style Icons fill:#FFF9C4
    style NavFrame fill:#F8BBD0

2.2 View层级代码表示

TaskbarDragLayer (R.id.taskbar_drag_layer)           // 1920×80dp (全屏宽度)
├── TaskbarView (R.id.taskbar_view)                  // MATCH_PARENT × 80dp
│   ├── QSB Container                                 // 搜索栏 (可选)
│   ├── BubbleTextView (icon 1)                      // 应用图标1 (48dp)
│   ├── BubbleTextView (icon 2)                      // 应用图标2 (48dp)
│   ├── BubbleTextView (icon 3)                      // 应用图标3 (48dp)
│   ├── BubbleTextView (icon 4)                      // 应用图标4 (48dp)
│   ├── BubbleTextView (icon 5)                      // 应用图标5 (48dp)
│   ├── FolderIcon (可选)                            // 文件夹图标
│   └── AllAppsButton                                // 所有应用按钮 (48dp)
│
├── StashedHandleView                                // Handle条 (120×4dp)
│
├── TaskbarScrimView                                 // 背景遮罩层
│
└── FrameLayout (导航按钮容器)                        // 右侧导航区
    ├── ImageButton (Back)                           // 返回按钮
    ├── ImageButton (Home)                           // Home按钮
    └── ImageButton (Recent)                         // 最近任务按钮

3. TaskbarView详细组成

3.1 TaskbarView布局示意图

┌──────────────────────────────────────────────────────────────────────┐
│ TaskbarView (高度80dp, 宽度MATCH_PARENT)                             │
├──────────────────────────────────────────────────────────────────────┤
│                                                                      │
│  ┌────┐  ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐  ┌────┐               │
│  │ 🔍 │  │📱│ │📧│ │🌐│ │📷│ │🎵│ │⚙️│ │📁│  │ ≡  │               │
│  │QSB │  │  │ │  │ │  │ │  │ │  │ │  │ │  │  │All │               │
│  └────┘  └──┘ └──┘ └──┘ └──┘ └──┘ └──┘ └──┘  └────┘               │
│                                                                      │
│  ← 4dp→←8→←48dp→←8→←48→←8→←48→←8→←48→←8→←48→←8→←48→←8→←48→←8→     │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘
   ↑       ↑     ↑     ↑     ↑     ↑     ↑     ↑     ↑
   边距   间距  图标   间距  图标   ...               AllApps

3.2 图标类型说明

a) BubbleTextView(应用图标)
┌────────────┐
│            │  ← 48dp × 48dp 触摸区域
│     📱     │  ← 图标 (实际36-40dp)
│            │
│    App     │  ← 应用名称 (可选显示)
└────────────┘
    
属性:
- mIconTouchSize: 48dp (触摸区域)
- actualIconSize: 36-40dp (图标大小)
- mItemMarginLeftRight: 8dp (左右间距)
- mItemPadding: 4dp (内边距)
b) FolderIcon(文件夹图标)
┌────────────┐
│  📱 📧     │  ← 48dp × 48dp
│  🌐 📷     │  ← 4个预览图标
│            │
│   Folder   │  ← 文件夹名称
└────────────┘

特点:
- 最多显示4个预览图标
- 点击展开Folder内容
- 支持拖拽添加/移除应用
c) AllAppsButton(所有应用按钮)
┌────────────┐
│            │  ← 48dp × 48dp
│     ≡      │  ← 三条横线图标
│            │
└────────────┘

功能:
- 点击打开All Apps抽屉
- Feature Flag控制显示
- PC模式下隐藏
d) QSB(搜索栏)
┌──────────────────────┐
│  🔍  Search apps...  │  ← 高度: 48-56dp
└──────────────────────┘

位置:
- RTL布局: 最右侧
- LTR布局: 最左侧
- 可选显示 (Feature Flag)

3.3 图标布局计算逻辑

// TaskbarView.java
public class TaskbarView extends FrameLayout {
    
    // 计算图标位置
    private void layoutIcons() {
        int actualIconSize = mActivityContext.getDeviceProfile().iconSizePx;  // 36-40dp
        int actualMargin = getResources().getDimensionPixelSize(
            R.dimen.taskbar_icon_spacing);  // 8dp
        
        // 触摸区域大小(保证最小48dp)
        mIconTouchSize = Math.max(actualIconSize, 
            getResources().getDimensionPixelSize(
                R.dimen.taskbar_icon_min_touch_size));  // 48dp
        
        // 实际间距调整
        mItemMarginLeftRight = actualMargin - (mIconTouchSize - actualIconSize) / 2;
        mItemPadding = (mIconTouchSize - actualIconSize) / 2;
        
        // 布局参数
        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
            mIconTouchSize, 
            mIconTouchSize
        );
        lp.leftMargin = mItemMarginLeftRight;
        lp.rightMargin = mItemMarginLeftRight;
    }
}

3.4 动画属性

TaskbarView的图标支持以下动画属性:

属性取值范围动画时长用途
Alpha0.0 ~ 1.0300msStash时淡入淡出
ScaleX/Y0.5 ~ 1.0300msStash时缩放
TranslationY-80dp ~ 0300msStash时下移
Rotation0° ~ 360°200ms文件夹打开动画
Background Color透明 ~ 半透明200ms主题图标背景

4. Controller层级

4.1 Controller架构图

Logic Controllers
View Controllers
核心Controllers
协调
协调
TaskbarStashController
协调显示隐藏
TaskbarDragController
处理拖拽
TaskbarLauncherStateController
同步Launcher状态
TaskbarRecentAppsController
最近任务
TaskbarAllAppsController
所有应用
TaskbarViewController
控制图标显示
StashedHandleViewController
控制Handle
TaskbarDragLayerController
控制顶层容器
TaskbarScrimViewController
控制背景遮罩
NavbarButtonsViewController
控制导航按钮
TaskbarActivityContext
主上下文
TaskbarControllers
控制器容器

4.2 Controller职责表

Controller主要职责控制的View关键方法
TaskbarViewController管理应用图标TaskbarViewinit(), updateIconAlpha(), updateIconScale()
StashedHandleViewController管理HandleStashedHandleViewinit(), updateScale(), onStashedHandleClick()
TaskbarStashController协调Stash逻辑无(协调器)updateStateForFlag(), applyState(), createAnimToIsStashed()
TaskbarDragLayerController管理顶层容器TaskbarDragLayerinit(), setTouchableRegion()
NavbarButtonsViewController管理导航按钮导航按钮容器init(), updateNavButtonColor()
TaskbarDragController处理拖拽事件onDragStart(), onDrop()
TaskbarScrimViewController管理背景遮罩TaskbarScrimViewupdateScrimAlpha()
TaskbarAllAppsController管理All AppsAllAppsButtontoggle(), show(), hide()
TaskbarRecentAppsController管理最近任务loadRecentApps()

4.3 Controller交互流程

User TaskbarStashController TaskbarViewController StashedHandleViewController TaskbarView/HandleView 触发Stash (如打开应用) updateStateForFlag(FLAG_IN_APP, true) applyState(300ms) computeIsStashed() → true 创建图标动画 Alpha 1→0 Scale 1→0.5 TransY 0→-80 创建Handle动画 Alpha 0→1 Scale 1→1 更新TaskbarView属性 图标淡出缩小下移 更新HandleView属性 Handle淡入显示 par [并行执行动画] 300ms后动画完成 只显示Handle User TaskbarStashController TaskbarViewController StashedHandleViewController TaskbarView/HandleView

5. 交互流程

5.1 用户交互场景

系统启动
打开应用/手动收起
点击Handle/返回桌面
点击图标
启动应用
应用前台
长按图标
显示菜单
关闭菜单
拖拽图标
放下图标
完成拖拽
点击Handle
展开Taskbar
Unstashed
Stashed
IconClick
AppLaunched
IconLongPress
ShowMenu
DragIcon
DropIcon
HandleClick
显示完整Taskbar
- 应用图标
- All Apps按钮
- 导航按钮
只显示Handle
- 应用图标隐藏
- Handle显示
- 导航按钮保持

5.2 触摸事件分发

Taskbar区域
Handle区域
导航按钮区域
其他区域
长按
拖拽
Back
Home
Recent
用户触摸屏幕
TaskbarDragLayer
onTouchEvent
触摸区域判断
TaskbarView
onTouchEvent
StashedHandleView
onTouchEvent
NavButtons
onTouchEvent
事件透传
点击图标?
启动应用
显示弹窗菜单
开始拖拽
展开Taskbar
按钮类型
返回
回桌面
最近任务
应用接收事件

5.3 Stash/Unstash触发条件

flowchart TD
    Start([状态变化]) --> Check{触发条件}
    
    Check -->|打开应用| Stash1[FLAG_IN_APP = true]
    Check -->|手动长按| Stash2[FLAG_STASHED_IN_APP_MANUAL = true]
    Check -->|输入法弹出| Stash3[FLAG_STASHED_IN_APP_IME = true]
    Check -->|Launcher收起| Stash4[FLAG_IN_STASHED_LAUNCHER_STATE = true]
    Check -->|5秒无交互| Stash5[FLAG_STASHED_IN_APP_AUTO = true]
    
    Check -->|返回桌面| Unstash1[FLAG_IN_APP = false]
    Check -->|点击Handle| Unstash2[FLAG_STASHED_IN_APP_MANUAL = false]
    Check -->|输入法关闭| Unstash3[FLAG_STASHED_IN_APP_IME = false]
    Check -->|Launcher展开| Unstash4[FLAG_IN_STASHED_LAUNCHER_STATE = false]
    
    Stash1 --> ApplyStash[applyState → Stashed]
    Stash2 --> ApplyStash
    Stash3 --> ApplyStash
    Stash4 --> ApplyStash
    Stash5 --> ApplyStash
    
    Unstash1 --> ApplyUnstash[applyState → Unstashed]
    Unstash2 --> ApplyUnstash
    Unstash3 --> ApplyUnstash
    Unstash4 --> ApplyUnstash
    
    ApplyStash --> End([显示Handle])
    ApplyUnstash --> End2([显示Taskbar])

6. 尺寸与布局

6.1 标准尺寸定义

// 尺寸资源 (res/values/dimens.xml)
<dimen name="taskbar_size">80dp</dimen>                      // Taskbar整体高度
<dimen name="taskbar_stashed_size">24dp</dimen>              // Stashed状态高度
<dimen name="taskbar_icon_min_touch_size">48dp</dimen>       // 图标最小触摸区域
<dimen name="taskbar_icon_spacing">8dp</dimen>               // 图标间距
<dimen name="taskbar_stashed_handle_width">120dp</dimen>     // Handle宽度
<dimen name="taskbar_stashed_handle_height">4dp</dimen>      // Handle高度
<dimen name="taskbar_nav_buttons_width">192dp</dimen>        // 导航按钮区域宽度
<dimen name="taskbar_nav_buttons_size">44dp</dimen>          // 单个导航按钮大小

6.2 布局尺寸示意图(精确尺寸)

屏幕宽度: 1920px (假设密度3.0, 即640dp)

┌────────────────────────────────────────────────────────────────┐
│                    屏幕顶部                                     │
│                       ...                                      │
│                                                                │
├────────────────────────────────────────────────────────────────┤
│ TaskbarDragLayer (640dp × 80dp)                               │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  ┌────┐  ┌──┐ ┌──┐ ┌──┐ ┌──┐ ┌──┐  ┌────┐      ┌──┬──┬──┐   │
│  │ 🔍 │  │📱│ │📧│ │🌐│ │📷│ │🎵│  │ ≡  │      │⬆️│🏠│◼️│   │
│  │56dp│  │48│ │48│ │48│ │48│ │48│  │48dp│      │44│44│44│   │
│  └────┘  └──┘ └──┘ └──┘ └──┘ └──┘  └────┘      └──┴──┴──┘   │
│                                                                │
│  ← 4→←8→←48→←8→←48→←8→←48→←8→←48→←8→←48→←8→←48→ ← 16 →      │
│                                                                │
│  ← TaskbarView (约400dp) →          ← 空白 →  ← NavButtons →  │
│                                                    (192dp)     │
└────────────────────────────────────────────────────────────────┘
  ↑                                                              ↑
  屏幕左边缘                                                  屏幕右边缘

6.3 Stashed状态尺寸

┌────────────────────────────────────────────────────────────────┐
│ TaskbarDragLayer (640dp × 24dp)                               │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│                     ━━━━━━━━━━━                 ┌──┬──┬──┐    │
│                      Handle                      │⬆️│🏠│◼️│    │
│                     (120×4dp)                    └──┴──┴──┘    │
│                                                                │
│  ← 居中对齐 →                          ← NavButtons (192dp) → │
└────────────────────────────────────────────────────────────────┘

6.4 不同屏幕密度适配

密度倍率Taskbar高度图标大小Handle高度
mdpi1.0x80px48px24px
hdpi1.5x120px72px36px
xhdpi2.0x160px96px48px
xxhdpi3.0x240px144px72px
xxxhdpi4.0x320px192px96px

6.5 横竖屏布局差异

横屏(Landscape)
┌──────────────────────────────────────────────────────────────────────┐
│                          应用内容                                     │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────────┐
│  🔍  📱 📧 🌐 📷 🎵 ⚙️ 📁  [≡]                           ⬆️ 🏠 ◼️    │
└──────────────────────────────────────────────────────────────────────┘
                 ↑ Taskbar固定在底部
竖屏(Portrait)- 部分设备支持
┌─────────────────┐
│                 │
│   应用内容      │
│                 │
│                 │
│                 │
│                 │
│                 │
│                 │
├─────────────────┤
│  🔍             │
│  📱             │
│  📧             │ ← Taskbar可能在侧边
│  🌐             │
│  📷             │
│  ⚙️             │
│                 │
│  ⬆️ 🏠 ◼️        │
└─────────────────┘

7. 视觉样式

7.1 颜色主题

// 默认颜色
public static final float TASKBAR_BACKGROUND_LUMINANCE = 0.30f;

// 浅色主题
背景色: #E8E8E8 (浅灰)
图标色: #000000 (黑色)
Handle: #DADCE0 (灰色)

// 深色主题
背景色: #1F1F1F (深灰)
图标色: #FFFFFF (白色)
Handle: #5F6368 (深灰)

// 动态主题(Material You)
背景色: 主题色 @ 30% luminance
图标色: 动态适配
Handle: 主题色 @ 50% opacity

7.2 阴影与圆角

// TaskbarView
elevation: 16dp                    // 阴影高度
corner_radius: 24dp                // 圆角半径(顶部)
background_alpha: 0.7              // 背景透明度

// StashedHandleView
elevation: 0dp                     // 无阴影
corner_radius: 2dp                 // 小圆角
background_alpha: 0.5              // 半透明

7.3 动画曲线

// Interpolators
EMPHASIZED: 先慢后快再慢 (Material Design标准)
LINEAR: 线性
DECELERATE: 减速
ACCELERATE: 加速

// 使用场景
Stash动画: EMPHASIZED (300ms)
图标点击: DECELERATE (150ms)
Handle提示: LINEAR (500ms)

8. 完整交互流程图

点击图标
长按图标
拖拽图标
点击Handle
点击AllApps
点击导航
卸载
应用信息
取消
Taskbar
删除区
文件夹
Back
Home
Recent
用户操作
操作类型
TaskbarView.onClickIcon
TaskbarView.onLongClickIcon
TaskbarDragController.onDragStart
StashedHandleView.onClick
AllAppsButton.onClick
NavButton.onClick
启动应用
切换到应用
应该Stash?
执行Stash动画
保持Unstashed
显示弹出菜单
菜单操作
卸载应用
打开应用信息
关闭菜单
进入拖拽状态
拖动图标
放下位置
重新排序
移除图标
添加到文件夹
执行Unstash动画
显示完整Taskbar
打开All Apps抽屉
按钮类型
返回
回到桌面
显示最近任务
完成

9. 关键代码位置索引

组件源文件关键方法
TaskbarViewTaskbarView.javainit(), updateHotseatItems(), getIconViews()
StashedHandleViewStashedHandleView.javainit(), setTranslationY(), setAlpha()
TaskbarDragLayerTaskbarDragLayer.javarecreateControllers(), onDestroy()
TaskbarViewControllerTaskbarViewController.javainit(), updateScale(), updateTranslationY()
StashedHandleViewControllerStashedHandleViewController.javainit(), updateScale(), onStashedHandleClick()
TaskbarStashControllerTaskbarStashController.javaupdateStateForFlag(), applyState(), createAnimToIsStashed()
TaskbarControllersTaskbarControllers.javainit(), 包含所有Controller引用
TaskbarActivityContextTaskbarActivityContext.javainitWindow(), updateDeviceProfile()

10. 总结

核心组件

  1. View层:

    • TaskbarDragLayer(容器)
    • TaskbarView(图标)
    • StashedHandleView(Handle)
  2. Controller层:

    • TaskbarViewController(图标控制)
    • StashedHandleViewController(Handle控制)
    • TaskbarStashController(状态协调)
  3. 关键尺寸:

    • 整体高度: 80dp
    • Stashed高度: 24dp
    • 图标大小: 48dp

UI特点

  • 🎨 支持Material You动态主题
  • 🌓 支持浅色/深色模式
  • 📱 响应式布局适配不同屏幕
  • ✨ 流畅的Stash/Unstash动画
  • 👆 优化的触摸交互体验
我刚开始弄framework,我想问问我该如何看源码,比如下面这段我该怎么看呢? /* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.quickstep; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.util.ActiveGestureLog.INTENT_EXTRA_LOG_TRACE_ID; import android.annotation.TargetApi; import android.content.Intent; import android.graphics.PointF; import android.os.Build; import android.os.SystemClock; import android.os.Trace; import android.view.View; import androidx.annotation.BinderThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; import com.android.launcher3.DeviceProfile; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.statemanager.StatefulActivity; import com.android.launcher3.taskbar.TaskbarUIController; import com.android.launcher3.util.RunnableList; import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener; import com.android.quickstep.views.DesktopTaskView; import com.android.quickstep.views.RecentsView; import com.android.quickstep.views.TaskView; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.InteractionJankMonitorWrapper; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; /** * Helper class to handle various atomic commands for switching between Overview. *
03-13
【复现】并_离网风光互补制氢合成氨系统容量-调度优化分析(Python代码实现)内容概要:本文围绕“并_离网风光互补制氢合成氨系统容量-调度优化分析”的主题,提供了基于Python代码实现的技术研究与复现方法。通过构建风能、太阳能互补的可再生能源系统模型,结合电解水制氢与合成氨工艺流程,对系统的容量配置与运行调度进行联合优化分析。利用优化算法求解系统在不同运行模式下的最优容量配比和调度策略,兼顾经济性、能效性和稳定性,适用于并网与离网两种场景。文中强调通过代码实践完成系统建模、约束设定、目标函数设计及求解过程,帮助读者掌握综合能源系统优化的核心方法。; 适合人群:具备一定Python编程基础和能源系统背景的研究生、科研人员及工程技术人员,尤其适合从事可再生能源、氢能、综合能源系统优化等相关领域的从业者;; 使用场景及目标:①用于教学与科研中对风光制氢合成氨系统的建模与优化训练;②支撑实际项目中对多能互补系统容量规划与调度策略的设计与验证;③帮助理解优化算法在能源系统中的应用逻辑与实现路径;; 阅读建议:建议读者结合文中提供的Python代码进行逐模块调试与运行,配合文档说明深入理解模型构建细节,重点关注目标函数设计、约束条件设置及求解器调用方式,同时可对比Matlab版本实现以拓宽工具应用视野。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值