android12 SystemUI之StatusBar(二)

StatusBar中通知面板显示流程

  1. 触摸事件分发 :当用户触摸屏幕顶部的状态栏时,MotionEvent 会首先被传递给 PhoneStatusBarView。它重写了 onTouchEvent 方法,但核心逻辑在其父类 PanelBar 中。
  2. PanelBar 处理触摸 :PanelBar.onTouchEvent 最终调用 mPanel.getView().dispatchTouchEvent(event),将事件传递给 PanelViewController 对应的 View(即 NotificationPanelView)进行处理
csharp 复制代码
//frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelBar.java)
 public boolean onTouchEvent(MotionEvent event) {
  ...
  //mPanel = PanelViewController是抽象类,实现类NotificationPanelViewController
  return mPanel == null || mPanel.getView().dispatchTouchEvent(event);
  }
  1. 控制器计算展开高度 :NotificationPanelViewController的子类PanelViewController 在 onTouch 处理 ACTION_MOVE 时,根据手指位置调用 setExpandedHeightInternal() 更新面板高度。

  2. 触发 panelExpansionChanged :在 setExpandedHeightInternal() 内部,会调用 notifyBarPanelExpansionChanged(),进而调用 PanelBar 的 panelExpansionChanged() 方法。

  3. PanelBar 更新状态并回调 :在 PanelBar.panelExpansionChanged() :

    • 当面板从关闭状态开始展开时(mState == STATE_CLOSED),执行:
    scss 复制代码
    go(STATE_OPENING);
    onPanelPeeked();  // 调用子类覆写的方法
    • go(STATE_OPENING) 会调用 mPanel.setIsShadeOpening(true),标记面板正在打开。

    • onPanelPeeked() 是一个空方法,由 PhoneStatusBarView 覆写,在其中调用 mBar.makeExpandedVisible(false),最终使 NotificationShadeWindowView 变为可见

相关推荐
好的佩奇15 小时前
Dart 之扩展类型
android·flutter·dart
alexhilton17 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
灿飞屋19 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫20 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
TimeFine1 天前
AI 编程工作流的设计:从人工判断到 AI裁判
android·ai编程
阿杰m1 天前
Android源码第四章:Android 系统启动——App 的第一行代码从哪来?
android
疯华整猫1 天前
混淆起初根本不是为了防破解:我用 Trae 把 Android 混淆这二十来年重跑了一遍
android·人工智能·计算机视觉
Carson带你学Android1 天前
AI时代,你的 App 会被 Agent 这三种方式调用
android·ai编程
恋猫de小郭1 天前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
好的佩奇2 天前
Dart 之扩展方法
android·flutter·dart