Android状态栏下拉处理
对安卓系统来说, 系统栏下拉菜单, 可能是和用户交互最多的UI模块之一. 虽然它提供的功能在各个厂商的定制UI上大同小异, 但还是有一些用户有定制化需求, 所以有必要搞清楚它的大致框架及流程.
StatusBar和SystemUI的关系
StatusBar是SystemUI的一部分, 那么它和SystemUI是如何联系在一起的呢:
BaseStatusBar继承了SystemUI
PhoneStatusBar继承了BaseStatusBar;
从源码中可以看到, TvStatusBar也继承了BaseStatusBar; 意味着如果我们要把Android移植到Phone和TV之外的新设备上, 并且需要一个不同的StatusBar的时候, 可以通过继承BaseStatusBar实现.
布局显示
主要布局文件有如下几个:
super_status_bar.xml
status_bar.xml
status_bar_expanded.xml
brightness_mirror.xml
最顶层是super_status_bar, 会走两个分支status_bar和status_bar_expanded; status_bar是系统栏, status_bar_expanded是系统栏下拉菜单
- status_bar这个分支主要呈现的是状态栏界面,状态栏细分左边和右边,左边是通知栏,右边是系统功能的状态图标显示
- status_bar_expanded这个分支主要呈现的下拉菜单界面,下拉菜单中又分快捷图标和信息通知栏
keyguard_status_view: 这个是锁屏界面的View
qs_panel: QS快捷面板
notification_stack_scroller: 信息通知栏
元素尺寸
如下文件, 定义了QS下拉面板中各项元素的尺寸大小
frameworks/base/packages/SystemUI/res/values/dimens.xml
系统栏的主要功能
1. 系统栏图标
主要是通过StatusBarIconController来控制状态栏图标的显示
包括:
BatteryMeterView: 电池图标.具体实现使用一个BatteryMeterDrawable来进行绘制.
如果需要更换电池图标, 修改绘制方法或者替换图标即可.
SignalClusterView ( R.id.signal_cluster ): 信号栏图标显示控制
mSystemIconArea ( R.id.system_icon_area ): 系统图标显示区域
2. 快速设置面板
QSContainer:是整个下拉菜单的实现者, 它包含了QSPanel和BaseStatusBarHeader
同时也管理了QS header和panel的动画
快速设置面板, 也包括几部分:
-
下拉菜单的最顶部, 对应显示部分如下图:
这部分对应的源码是: QuickStatusBarHeader.java, 实现了BaseStatusBarHeader接口
对应的布局文件是: quick_status_bar_expanded_header.xml
包含如下这些元素:
R.id.header_emergency_calls_only
R.id.edit
R.id.date_time_alarm_group
R.id.expand_indicator
R.id.quick_qs_panel
R.id.settings_button
R.id.alarm_status
R.id.multi_user_switch -
如下部分, 是第一步下拉后, 出现的快捷按钮
这部分对应的源码是: QuickQSPanel.java
它的作用是只在QS最上面显示一行快捷图标 -
下拉菜单的其他部分:
-
两个重要的对象
QSPanel
是一个LinearLayout. 所有快捷设置开关, 亮度调节条等, 都包含在QSPanel中. 如果
要添加其它的界面元素, 比如音量调节条和收起按钮等, 也添加在QSPanel中
NotificationPanelView
是一个FrameLayout. 主要处理下拉菜单界面变动事件, 包括对Touch事件的处理.
对下拉菜单从两次下拉改为单次下拉,在onTouchEvent里面修改
3. 系统通知信息
StatusBar的重要功能之一是显示系统通知消息
它通过NotificationListenerService来获得系统通知消息.
具体实现是在BaseStatusBar, 通过创建并且注册NotificationListenerService实例实现
监听通知栏消息, PhoneStatusBar继承了这个机制.
在BaseStatusBar的start函数中
//注册了一个系统service,监听Notification消息
mNotificationListener.registerAsSystemService
如果不需要显示系统通知, 理论上将这句代码注释掉即可
4. 下拉菜单事件处理
PhoneStatusBar
//处理touch消息
interceptTouchEvent
//收到WORK_CHALLENGE_UNLOCKED_NOTIFICATION_ACTION消息
//由startWorkChallengeIfNecessary发出
onWorkChallengeUnlocked
NotificationPanelView
//当下拉状态栏时,首先收到如下消息
onTouchEvent, 如果需要修改下拉菜单对触摸事件的响应,可以在这个函数中修改,比如将
两次下拉修改为单次下拉
NotificationPanelView继承了PanelView,
PanelView实现了expand/collapse的动画效果,
PanelView继承了FrameLayout
其他的一些比较重要的文件
Android资源文件目录res下的layout目录下的xml文件, 是将UI组件组合起来的一种方式.
PhoneStatusBar包括:
KeyguardUserSwitcher
KeyguardMonitor
LockscreenWallpaper
StatusBarWindowView ( R.layout.super_status_bar )
PhoneStatusBarView ( R.id.status_bar status_bar.xml)
StatusBarWindowManager
DozeServiceHost
NotificationPanelView ( R.id.notification_panel )
AutoReinflateContainer( R.id.qs_auto_reinflate_container )
QSPanel( qs_panel.xml )
BaseStatusBarHeader
KeyguardStatusBarView
KeyguardBottomAreaView
系统栏下拉菜单的一大功能当然是快捷设置开关, 如下:
BluetoothControllerImpl
SecurityControllerImpl
BatteryController
LocationControllerImpl
NetworkControllerImpl
HotspotControllerImpl
RotationLockControllerImpl
UserInfoController
ZenModeController
CastControllerImpl
VolumeComponent
FlashlightController
UserSwitcherController
NextAlarmController
BrightnessMirrorController
AccessibilityController
FingerprintUnlockController
LightStatusBarController
KeyguardIndicationController
参考
以下是对NotificationListenerService的说明
- NotificationListenerService的定义
A service that receives calls from the system when new notifications are posted or removed, or their ranking changed. - 具体用法, 参考
Android状态栏下拉处理
对安卓系统来说, 系统栏下拉菜单, 可能是和用户交互最多的UI模块之一. 虽然它提供的功能在各个厂商的定制UI上大同小异, 但还是有一些用户有定制化需求, 所以有必要搞清楚它的大致框架及流程.
StatusBar和SystemUI的关系
StatusBar是SystemUI的一部分, 那么它和SystemUI是如何联系在一起的呢:
BaseStatusBar继承了SystemUI
PhoneStatusBar继承了BaseStatusBar;
从源码中可以看到, TvStatusBar也继承了BaseStatusBar; 意味着如果我们要把Android移植到Phone和TV之外的新设备上, 并且需要一个不同的StatusBar的时候, 可以通过继承BaseStatusBar实现.
布局显示
主要布局文件有如下几个:
super_status_bar.xml
status_bar.xml
status_bar_expanded.xml
brightness_mirror.xml
最顶层是super_status_bar, 会走两个分支status_bar和status_bar_expanded; status_bar是系统栏, status_bar_expanded是系统栏下拉菜单
- status_bar这个分支主要呈现的是状态栏界面,状态栏细分左边和右边,左边是通知栏,右边是系统功能的状态图标显示
- status_bar_expanded这个分支主要呈现的下拉菜单界面,下拉菜单中又分快捷图标和信息通知栏
keyguard_status_view: 这个是锁屏界面的View
qs_panel: QS快捷面板
notification_stack_scroller: 信息通知栏
元素尺寸
如下文件, 定义了QS下拉面板中各项元素的尺寸大小
frameworks/base/packages/SystemUI/res/values/dimens.xml
系统栏的主要功能
1. 系统栏图标
主要是通过StatusBarIconController来控制状态栏图标的显示
包括:
BatteryMeterView: 电池图标.具体实现使用一个BatteryMeterDrawable来进行绘制.
如果需要更换电池图标, 修改绘制方法或者替换图标即可.
SignalClusterView ( R.id.signal_cluster ): 信号栏图标显示控制
mSystemIconArea ( R.id.system_icon_area ): 系统图标显示区域
2. 快速设置面板
QSContainer:是整个下拉菜单的实现者, 它包含了QSPanel和BaseStatusBarHeader
同时也管理了QS header和panel的动画
快速设置面板, 也包括几部分:
-
下拉菜单的最顶部, 对应显示部分如下图:
这部分对应的源码是: QuickStatusBarHeader.java, 实现了BaseStatusBarHeader接口
对应的布局文件是: quick_status_bar_expanded_header.xml
包含如下这些元素:
R.id.header_emergency_calls_only
R.id.edit
R.id.date_time_alarm_group
R.id.expand_indicator
R.id.quick_qs_panel
R.id.settings_button
R.id.alarm_status
R.id.multi_user_switch -
如下部分, 是第一步下拉后, 出现的快捷按钮
这部分对应的源码是: QuickQSPanel.java
它的作用是只在QS最上面显示一行快捷图标 -
下拉菜单的其他部分:
-
两个重要的对象
QSPanel
是一个LinearLayout. 所有快捷设置开关, 亮度调节条等, 都包含在QSPanel中. 如果
要添加其它的界面元素, 比如音量调节条和收起按钮等, 也添加在QSPanel中
NotificationPanelView
是一个FrameLayout. 主要处理下拉菜单界面变动事件, 包括对Touch事件的处理.
对下拉菜单从两次下拉改为单次下拉,在onTouchEvent里面修改
3. 系统通知信息
StatusBar的重要功能之一是显示系统通知消息
它通过NotificationListenerService来获得系统通知消息.
具体实现是在BaseStatusBar, 通过创建并且注册NotificationListenerService实例实现
监听通知栏消息, PhoneStatusBar继承了这个机制.
在BaseStatusBar的start函数中
//注册了一个系统service,监听Notification消息
mNotificationListener.registerAsSystemService
如果不需要显示系统通知, 理论上将这句代码注释掉即可
4. 下拉菜单事件处理
PhoneStatusBar
//处理touch消息
interceptTouchEvent
//收到WORK_CHALLENGE_UNLOCKED_NOTIFICATION_ACTION消息
//由startWorkChallengeIfNecessary发出
onWorkChallengeUnlocked
NotificationPanelView
//当下拉状态栏时,首先收到如下消息
onTouchEvent, 如果需要修改下拉菜单对触摸事件的响应,可以在这个函数中修改,比如将
两次下拉修改为单次下拉
NotificationPanelView继承了PanelView,
PanelView实现了expand/collapse的动画效果,
PanelView继承了FrameLayout
其他的一些比较重要的文件
Android资源文件目录res下的layout目录下的xml文件, 是将UI组件组合起来的一种方式.
PhoneStatusBar包括:
KeyguardUserSwitcher
KeyguardMonitor
LockscreenWallpaper
StatusBarWindowView ( R.layout.super_status_bar )
PhoneStatusBarView ( R.id.status_bar status_bar.xml)
StatusBarWindowManager
DozeServiceHost
NotificationPanelView ( R.id.notification_panel )
AutoReinflateContainer( R.id.qs_auto_reinflate_container )
QSPanel( qs_panel.xml )
BaseStatusBarHeader
KeyguardStatusBarView
KeyguardBottomAreaView
系统栏下拉菜单的一大功能当然是快捷设置开关, 如下:
BluetoothControllerImpl
SecurityControllerImpl
BatteryController
LocationControllerImpl
NetworkControllerImpl
HotspotControllerImpl
RotationLockControllerImpl
UserInfoController
ZenModeController
CastControllerImpl
VolumeComponent
FlashlightController
UserSwitcherController
NextAlarmController
BrightnessMirrorController
AccessibilityController
FingerprintUnlockController
LightStatusBarController
KeyguardIndicationController
参考
以下是对NotificationListenerService的说明
- NotificationListenerService的定义
A service that receives calls from the system when new notifications are posted or removed, or their ranking changed. - 具体用法, 参考