第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Android状态栏下拉处理

Android状态栏下拉处理

时间:2024-02-07 12:31:02

相关推荐

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.具体用法, 参考https://developer./reference/kotlin/android/service/notification/NotificationListenerService

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。