StatusBar中通知面板显示流程
- 触摸事件分发 :当用户触摸屏幕顶部的状态栏时,
MotionEvent会首先被传递给PhoneStatusBarView。它重写了onTouchEvent方法,但核心逻辑在其父类PanelBar中。 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);
}
-
控制器计算展开高度 :
NotificationPanelViewController的子类PanelViewController在onTouch处理ACTION_MOVE时,根据手指位置调用setExpandedHeightInternal()更新面板高度。 -
触发
panelExpansionChanged:在setExpandedHeightInternal()内部,会调用notifyBarPanelExpansionChanged(),进而调用PanelBar的panelExpansionChanged()方法。 -
PanelBar更新状态并回调 :在PanelBar.panelExpansionChanged():- 当面板从关闭状态开始展开时(
mState == STATE_CLOSED),执行:
scssgo(STATE_OPENING); onPanelPeeked(); // 调用子类覆写的方法-
go(STATE_OPENING)会调用mPanel.setIsShadeOpening(true),标记面板正在打开。 -
onPanelPeeked()是一个空方法,由PhoneStatusBarView覆写,在其中调用mBar.makeExpandedVisible(false),最终使NotificationShadeWindowView变为可见
- 当面板从关闭状态开始展开时(