一.运营商信息控件

运营商的控件有两个,一个是锁屏下显示的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状态栏主要控件相关推荐

  1. qt android 浮动窗口,QT+ 状态栏+核心控件+浮动窗口

    #include "mainwindow.h" #include #include #include #include //浮动窗口所需的头文件 MainWindow::MainW ...

  2. SystemUi状态栏客制化功能和常见问题分析

    一.多图标成点 当系统图标区域或者通知图标区域图标过多,而区域不够时,就会将多余的图标隐藏,并显示一个点,如下图所示. 介绍此功能之前先看一下图标的初始化过程,从中可以看到有个config_statu ...

  3. vbnet加载ocx控件不能生成窗体_解决VB6.0中不能加载MSCOMCTL.OCX的错误提示

    VB6.0毕竟是很古老的开发工具了,其对所使用的第三方组件依赖性比较强,例如在打开从其它电脑上拿来的VB6.0的软件(系统)的工程文件(源代码)时,经常会遇到"不能加载MSCOMCTL.OC ...

  4. C#之 十九 使用WinForm控件

    十九 使用Win Form控件 比如说电脑有显示器,鼠标,主机以及键盘的基本元素组成.在windows窗体中也有其基本控件,这些控件在每一个窗体中都要用到,也就是说无所不在.有些控件可能外观不同但是他 ...

  5. Windows窗体学这一篇就够了(C#控件讲解)

    目录 一.Form窗体 1.1窗体的创建和删除 1.添加窗体 2.删除窗体 3.多窗体的使用 1.2.窗体属性 1.2.1更换窗体图标 1.2.2隐藏窗体的标题栏(FormBorderStyle属性) ...

  6. 全能开发工具 ComponentOne(3)——常用控件下篇

    在全能开发工具 ComponentOne -- 常用控件上篇中,小编向大家分别介绍了: 1.高性能表格控件 -- ComponentOne FlexGrid 2.包含80多种2D和3D类型的图表控件 ...

  7. Android 9.0 去除锁屏界面及SystemUI无sim卡拨打紧急电话控件显示功能实现

    1.1概述 在9.0的系统rom定制化开发中,关于SystemUI的定制化功能也是比较多的,在SystemUI的锁屏页面和状态栏提示无sim卡拨打紧急电话控件显示等相关提示 的功能中,在有些syste ...

  8. Windows Forms高级界面组件-使用状态栏控件

    状态栏(StatusStrip)控件通常显示在窗体的底部,向用户提供有关应用程序状态的信息.如Word应用程序使用状态栏提供页码.行数和列数的信息. StatusStrip派生于ToolStrip,通 ...

  9. pythongui界面实例带注释_python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例...

    PyQt5状态栏控件QStatusBar简介 MainWindow对象在底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时的状态信息 QStatusBar类中的常用方法 方法 ...

最新文章

  1. 找回 : MobileCoreServices.framework
  2. 小试ASP.NET 2.0的兼容性
  3. idea 设置加载多个资源文件,显示本地图片
  4. 干货|吴恩达Coursera课程教你学习神经网络二!
  5. 综述 | 知识图谱实体链接:一份“由浅入深”的综述
  6. ❤️六W字《计算机基础知识》(八)(建议收藏)❤️
  7. 虚拟专题:联邦学习 | 面向隐私保护的非聚合式数据共享综述
  8. php正则学习,php中正则表达式的学习及应用
  9. 事件循环机制 + ES7:Async/Await(基于generator原理实现)附详细示例分析
  10. 华为开会有“原则”?企业的成功都从会议开始
  11. nexus4恢复原生系统_深度好文!新浪微博架构师详析微博云原生技术的思考与实践...
  12. Promise的简单使用例子
  13. 【C#】WM 消息大全
  14. ubuntu linux 系统搭建我的世界基岩版 私服我的世界服务器
  15. hdoj1000解题报告
  16. mklink实现软件搬家清理C盘空间
  17. 虹科案例 | 移动运营商:使用手持式频谱仪进行干扰检测
  18. NVI(Non-Virtual Interface)手法
  19. 巴比特 | 元宇宙每日必读:多路径试水却并未摸清元宇宙的轮廓,互联网大厂对元宇宙的布局仍处于“盲人摸象”的阶段?...
  20. 这20种PS技术让你的照片美不胜收

热门文章

  1. 数字图像处理Python语言实现-图像增强-各向异性扩散滤波
  2. 看完你就懂的PID算法
  3. Xcode 11 的那些新东西
  4. 数据压缩实验一:yuv转rgb格式实验报告
  5. 如何学会思维导图进行高效会议
  6. java http请求图片_Java上传带图片的Http请求
  7. Java中的常用开发工具详解
  8. could not retrieve mirrorlist报错解决方法
  9. English Note 有关成功和人生意义的英语对话
  10. python九九乘法口诀表