SystemUi状态栏主要控件
一.运营商信息控件
运营商的控件有两个,一个是锁屏下显示的CarrierText,一个是解锁下显示的OperatorNameView。解锁状态下的OperatorNameView默认显示为空,只有当插入sim卡,并检测到sim卡状态已经准备好后才会显示运营商信息,具体控制是由KeyguardupdateMonitorCallback监听sim状态变化执行updateText方法进行更新信息;锁屏下的运营商信息显示由CarrierTextController控制,通过KeyguardUpdateMonitor -Callback的onSimStateChanged方法监听sim卡状态变化,onRefreshCarrierInfo实时刷新sim卡状态信息,通过updateCarrierText方法获取sim卡状态信息,之后封装显示信息,调用CarrierTextCallback的方法updateCarruerInfo,而在CarrierText中实现了这个方法,并实现更新显示信息。
CarrierText:监听 CarrierTextController,封装了 KeyguardUpdateMonitorCallback 接口。
路径为frameworks/base/packages/SystemUI/src/com/android/keyguard/CarrierText.java。
OperatorNameView:实现了 KeyguardUpdateMonitorCallback 接口,用于监听 sim 卡信息的变化并更 新运营商信息。路径为:frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/OperatorNameView.java。
这两个控件的区别在于,CarrierText 显示所有状态下的运营商信息,而 OperatorNameView 只显示能正常时的运营商信息。
二.时间和日期控件
时钟日期的显示默认是使用网络提供的时间和时区,也可以自定义,其中时间的格式有24小时制和12小时制,这里的设置在TimerFormatPreferenceController中设置Settings.System数据库中添加了 “TIME_12_24”信息,值是null或者24,之后在显示控制类中获取这个值来显示。在DateFormat类的is24HourFormat()方法进行了处理和判断。
时间和日期分别由两个不同的控件控制:
Clock:时间控件,路径为 /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java
DateView:日期控件,路径为 /frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java
DataView 的日期格式不受 Settings 中的日期格式控制,如需修改可以在 quick_qs_status_icons.xml 中的 com.android.systemui.statusbar.policy.DateView 内添加 systemui:datePattern 属性,然后自定义时间格式。
三.系统图标控件
Android 11.0 延续了 Android 9.0 中的系统图标设计,系统中包含的图标如图所示。
frameworks/base/core/res/res/values/config.xml中的config_statusBarIcons里。
这些图标都定义在了/frameworks/base/core/res/res/values/config.xml 中的 config_statusBarIcons 里,如图所示:
图标控件
Android 11.0 版本里的系统图标控件分为三种:
l StatusBarWifiView:wifi 图标
l StatusBarMoblieview:信号图标
l StatusBarIconView:其他图标,如蓝牙、热点、闹钟等
系统图标关系如图所示。
系统图标的显示过程不同于其他的状态栏图标,系统图标只有在某些功能发现变化时才会显示或更新。系统图标的更新控制基本都集中在StatusBarSignalPolicy.java和PhoneStatusBarPolicy.java里, 其分别控制的系统图标如下图所示,可以看到StatusBarSignalPolicy主要控制信号类系统图标,PhoneStatusBarPolicy主要控制状态类系统图标。
系统图标的显示流程大体类似,只是功能控制类不同。大体都是通过各自的Controller类监听功能状态,然后通过CallBack接口调Policy类,再通过IconController来刷新图标,如下图是 大致更新过程。
图标的显示更新都是由相应的控制类监听触发notifyListener方法,之后通过callback触发policy,再通过StatusBarIconController显示刷新小图标,这里设置图标的大小是通过读取status_bar_icon_size的值,这里为22dip。
图标显示由图标容器StatusIconContainer控制,在这个类中绘制图标的显示逻辑,其中方法calculateIconTranslations()计算图标的具体显示逻辑。
四.电池控件
电池控件是frameworks\base\packages\SystemUI\src\com\android\systemui\BatteryMeterView.java。此控件平台有做客制化,主要是实现充电动画功能,此功能通过config_battery_animation属性来控制。另一个需要关注的是电池百分比显示功能,此功能有两种方式实现,一种是调用setForceShowPercent()方法,来强制显示百分比,这就是锁屏状态栏显示百分比使用的方式;另一种是设置Setting.System数据库里的SHOW_BATTERY_PERCENT值来控制,这个是Settings设置显示电池百分比的方式。
电量显示有两种模式,一种是单纯显示电量图标,一种是显示图标加电量百分比,且充电模式下,会有充电动画,由ThemedBatteryDrawable的setCharging方法控制,电量的视图由自定义view-BatteryMeterView完成,电池有保护模式,充电模式下,电量处于40%至60%时,不再进行充电,所以会关闭充电动画,可以通过设置应用设置的全局节点信息battery_protected判断,电量切换显示百分比在设置应用也设置Settings.System数据库,key为SHOW_BATTERY_PERCENT,通过key在电量视图控制类进行处理。
电池图标的绘制都是代码画出来的,在自定义view加载了ThemedBatteryDrawable类型的drawable,就是使用这个绘制图标的,里面loadPaths()方法就是去加载电池图标资源的路径。
路径在frameworks/base/core/core/res/res/values/config.xml中
config_batterymeterPerimeterPath 电池外框,空心的
config_batterymeterErrorPerimeterPath 电池外框,空心的,这个用来画battery saver模式的外框,路径一样只是颜色不一样
config_batterymeterFillMask 电池内框,就是电量
config_batterymeterBoltPath 闪电,充电的
config_batterymeterPowersavePath 加号
可以将这些资源路径放在vector中查看图标具体长什么样子,之后自己客制化,之后在通过draw()方法进行绘制图标。
五.通知图标控件
通知图标控件其实也是StatusBarIconView,通知图标的创建和更新流程大致如下图
六.图标容器控件
Android 11.0 中有两个容器控件:
l StatusIconContainer:系统图标容器控件,是系统图标的父类控件。
l NotificationIconContainer:通知图标容器控件,是通知图标的父类控件。
用户根据当前容器控件的大小来控制子控件的显示状态:
l STATE_ICON:0
l STATE_HIDDEN:1
l STATE_DOT:2
0 代表显示图标,1 代表图标隐藏,2 代表图标隐藏显示圆点。
StatusIconContainer 控制子控件显示状态的核心方法是 calculateIconTranslations,详细操作步骤如下。
NotificationIconContainer 显示逻辑与之基本类似。
步骤 1 按从后到前的顺序计算当前需要显示的图标数,并计算剩余的空间 transaltionx。
步骤 2 通过 state.xTranslation 计算第一个无法显示的图标 index。
步骤 3 通过 firstUnderflowIndex 将第一个无法显示的图标设置为 STATE_ICON
1)控件宽度 2)除去paddingEnd宽度
3)按从后到前的顺序计算当前需要显示的图标数,并计算剩余的空间translationX
通过state.xTranslation计算出第一个无法完整显示的图标index
通过firstUnderflowIndex将第一个无法完整显示的图标设置成STATE_DOT,并将前面的图标设置成STATE_HIDDEN
SystemUi状态栏主要控件相关推荐
- qt android 浮动窗口,QT+ 状态栏+核心控件+浮动窗口
#include "mainwindow.h" #include #include #include #include //浮动窗口所需的头文件 MainWindow::MainW ...
- SystemUi状态栏客制化功能和常见问题分析
一.多图标成点 当系统图标区域或者通知图标区域图标过多,而区域不够时,就会将多余的图标隐藏,并显示一个点,如下图所示. 介绍此功能之前先看一下图标的初始化过程,从中可以看到有个config_statu ...
- vbnet加载ocx控件不能生成窗体_解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
VB6.0毕竟是很古老的开发工具了,其对所使用的第三方组件依赖性比较强,例如在打开从其它电脑上拿来的VB6.0的软件(系统)的工程文件(源代码)时,经常会遇到"不能加载MSCOMCTL.OC ...
- C#之 十九 使用WinForm控件
十九 使用Win Form控件 比如说电脑有显示器,鼠标,主机以及键盘的基本元素组成.在windows窗体中也有其基本控件,这些控件在每一个窗体中都要用到,也就是说无所不在.有些控件可能外观不同但是他 ...
- Windows窗体学这一篇就够了(C#控件讲解)
目录 一.Form窗体 1.1窗体的创建和删除 1.添加窗体 2.删除窗体 3.多窗体的使用 1.2.窗体属性 1.2.1更换窗体图标 1.2.2隐藏窗体的标题栏(FormBorderStyle属性) ...
- 全能开发工具 ComponentOne(3)——常用控件下篇
在全能开发工具 ComponentOne -- 常用控件上篇中,小编向大家分别介绍了: 1.高性能表格控件 -- ComponentOne FlexGrid 2.包含80多种2D和3D类型的图表控件 ...
- Android 9.0 去除锁屏界面及SystemUI无sim卡拨打紧急电话控件显示功能实现
1.1概述 在9.0的系统rom定制化开发中,关于SystemUI的定制化功能也是比较多的,在SystemUI的锁屏页面和状态栏提示无sim卡拨打紧急电话控件显示等相关提示 的功能中,在有些syste ...
- Windows Forms高级界面组件-使用状态栏控件
状态栏(StatusStrip)控件通常显示在窗体的底部,向用户提供有关应用程序状态的信息.如Word应用程序使用状态栏提供页码.行数和列数的信息. StatusStrip派生于ToolStrip,通 ...
- pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...
PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...
最新文章
- 找回 : MobileCoreServices.framework
- 小试ASP.NET 2.0的兼容性
- idea 设置加载多个资源文件,显示本地图片
- 干货|吴恩达Coursera课程教你学习神经网络二!
- 综述 | 知识图谱实体链接:一份“由浅入深”的综述
- ❤️六W字《计算机基础知识》(八)(建议收藏)❤️
- 虚拟专题:联邦学习 | 面向隐私保护的非聚合式数据共享综述
- php正则学习,php中正则表达式的学习及应用
- 事件循环机制 + ES7:Async/Await(基于generator原理实现)附详细示例分析
- 华为开会有“原则”?企业的成功都从会议开始
- nexus4恢复原生系统_深度好文!新浪微博架构师详析微博云原生技术的思考与实践...
- Promise的简单使用例子
- 【C#】WM 消息大全
- ubuntu linux 系统搭建我的世界基岩版 私服我的世界服务器
- hdoj1000解题报告
- mklink实现软件搬家清理C盘空间
- 虹科案例 | 移动运营商:使用手持式频谱仪进行干扰检测
- NVI(Non-Virtual Interface)手法
- 巴比特 | 元宇宙每日必读:多路径试水却并未摸清元宇宙的轮廓,互联网大厂对元宇宙的布局仍处于“盲人摸象”的阶段?...
- 这20种PS技术让你的照片美不胜收