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 变为可见

相关推荐
文人sec13 小时前
MySQL主库出问题了,从库怎么办?备库为什么会延迟好几个小时?
android·数据库·mysql
hai_android14 小时前
不用 AIDL,手把手教你手写 Binder 代理类
android·kotlin
mmsx15 小时前
osmdroid 地图实战 03|地图的"分层世界":离线方案、图层模型与 Overlay 体系
android·前端
张文是假的啊16 小时前
IOC依赖注入问题:@Primary 和 @Qualifier的使用
android
换元不配限16 小时前
ConstraintLayout核心用法详解(三):引导线、屏障、组和占位
android·placeholder·barrier·约束布局·guideline
心平气和量大福大17 小时前
android studio(AS)工具-调试-统计总行数
android·ide·android studio
你的坚定19 小时前
SurfaceFlinger合成一帧的完整流程
android
爱笑鱼20 小时前
Android 系统启动机制(七):进入 SystemServer.main() 以后,system_server 还是一个空进程吗?
android·linux
好安静21 小时前
SurfaceFlinger 合成一帧的完整流程
android
alexhilton21 小时前
架构测试为何需要双视图
android·kotlin·android jetpack