最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

Android状态栏下拉处理

IT圈 admin 17浏览 0评论

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是系统栏下拉菜单

  1. status_bar这个分支主要呈现的是状态栏界面,状态栏细分左边和右边,左边是通知栏,右边是系统功能的状态图标显示
  2. 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的动画
 快速设置面板, 也包括几部分:

  1. 下拉菜单的最顶部, 对应显示部分如下图:
    这部分对应的源码是: 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

  2. 如下部分, 是第一步下拉后, 出现的快捷按钮

    这部分对应的源码是: QuickQSPanel.java
    它的作用是只在QS最上面显示一行快捷图标

  3. 下拉菜单的其他部分:

  4. 两个重要的对象
    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的说明

  1. NotificationListenerService的定义
    A service that receives calls from the system when new notifications are posted or removed, or their ranking changed.
  2. 具体用法, 参考

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是系统栏下拉菜单

  1. status_bar这个分支主要呈现的是状态栏界面,状态栏细分左边和右边,左边是通知栏,右边是系统功能的状态图标显示
  2. 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的动画
 快速设置面板, 也包括几部分:

  1. 下拉菜单的最顶部, 对应显示部分如下图:
    这部分对应的源码是: 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

  2. 如下部分, 是第一步下拉后, 出现的快捷按钮

    这部分对应的源码是: QuickQSPanel.java
    它的作用是只在QS最上面显示一行快捷图标

  3. 下拉菜单的其他部分:

  4. 两个重要的对象
    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的说明

  1. NotificationListenerService的定义
    A service that receives calls from the system when new notifications are posted or removed, or their ranking changed.
  2. 具体用法, 参考

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论