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的子类PanelViewControlleronTouch 处理 ACTION_MOVE 时,根据手指位置调用 setExpandedHeightInternal() 更新面板高度。

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

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

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

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

相关推荐
Lesile3 小时前
Interview#1 历史演进:MVC · MVP · MVVM · MVI架构详解
android·android jetpack
杉氧3 小时前
Flutter 像素级还原实战:用 CustomPaint 与 Bezier 曲线手绘精致图针
android·前端·flutter
我命由我123456 小时前
Android 在构建过程中,发现有两个依赖库都包含了相同路径的资源文件
android·java·开发语言·java-ee·kotlin·android-studio·android runtime
Coffeeee6 小时前
谷歌的一个优化建议,让我重新学了一遍Android里面如何正确处理位图
android·google·kotlin
冰暮流星7 小时前
mysql之新建表及对表的查询
android·数据库·mysql
用户2018792831677 小时前
彻底搞懂LayoutInflater、ViewInflater与textViewStyle优先级:XML属性为何能覆盖全局样式?
android
达达尼昂7 小时前
AI Native 工程实践:如何为 Claude 5 设计更有效的上下文
android·人工智能·后端
Cry丶8 小时前
【已解决】adb devices 能识别手机,但 HBuilderX 搜索不到设备的避坑指南
android·adb·uni-app·hbuilderx·真机调试
墨神谕8 小时前
认识一下Unicode(统一码)
android·java·数据库