Android QS面板源码(上)

简介: Android QS面板源码

Android SystemUI 通知面板实现


这篇文章给大家分享下Android SystemUI中下拉通知面板时所看到的开关面板(即QS面板)的实现原理,包括其整体架构,UI构建流程与事件处理流程,对这块感兴趣的同学可以看看


一.QS面板构成元素解析


QS面板实际上有多种状态,包括:

  • Quick Quick Settings (QQS) : 即初级展开面板,是一次下拉面板看到的简版QS面板,包含少量的开关,如下左侧的图
  • Quick Settings (QS) : 完整QS面板,是二次下拉面板看到的完成QS面板,其包含更多的开关,如下右侧的图
  • 另外还有开关编辑面板,开关详情页面,本文不展开描述


image.png


备注:SystemUI中称通知栏下拉面板开关区域中的单个开关为Tile

先看看整个QS面板中主要的几大类簇:


image.png


下面分别介绍各个类簇的主要作用

1. QSTile类簇,该类簇包括的主要类如下,类图如下


image.png


packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTile.java
packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
packages/SystemUI/src/com/android/systemui/qs/tiles/XxxTile.java

该类簇构成了的Tile的"后端",负责处理单个Tile的逻辑处理,其中:

  • QSTile : 接口,主要定义了所有Tile的通用行为,如注册监听,点击事件的处理,Tile视图中Icon元素(QSIconView)的构建,刷新Tile状态(state)等
  • QSTileImpl : 实现了QSTile定义的通用行为,同时提供了一系列的抽象接口(详见类图)允许不同类型的子类去做差异化实现.后续所有的开关都需要继承自QSTileImpl. 如WifiTile,通过继承QSTileImpl来享用其提供的通用方法,不需要每个开关都去做实现,同时利用差异化接口便可实现开关自身的特有逻辑,如WifiTilehandleClick可以打开Wifi开关,而BluetoothTilehandleClick则可以打开蓝牙开关

2.QSTileView类簇 该类簇包括的主要类如下,类图如下


image.png


packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSTileView.java
packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileBaseView.java
packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSIconView.java
packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSIconViewImpl.java

该类簇构成了的Tile的视图层,负责处理单个Tile的界面展示,其中:

  • qs/QSTileView : 抽象类,定义了Tile视图相关的操作,如点击事件设置,视图刷新onStateChanged(State state)
  • QSTileBaseView : 实现了QSTileView中定义的抽象接口,同时在其构造方法中完成了Tile视图的构建,包括背景的处理,点击效果的处理(如ripple),点击事件的处理等. 在QQS面板中使用
  • QSTileView : 注意与上面的同名抽象类区分开来,这里的起名容易让人疑惑,实际上这里的QSTileView继承了QSTileBaseView,在其构建的视图的基础上,扩展了label相关的东西,label即为开关中的文字描述视图,如蓝牙开关对应的label为"蓝牙". 在QS面板中使用


3.QSHost类簇,该类簇包括的主要类如下,类图如下


image.png

image.png


packages/SystemUI/src/com/android/systemui/qs/QSHost.java
packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java
packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java

该类簇主要完成单个Tile的构建,其中:


  • QSHost : 接口,主要向外界提供获取QSTile集合的接口(getTiles())以及作为Tile对外沟通的桥梁,例如点击某个开关后需要触发收起面板的操作,开关便会通过QSHost来触发收起面板的操作
  • QSTileHost : 实现了QSHost中定义的接口,同时扩展了创建Tile后端对象QSTile和创建Tile视图对象QSTileView的接口. 创建时使用了工厂模式,由QSFactoryImpl类实现


其中QSTileHost作为外界创建Tile的入口,会在对象构造的过程中先去创建Tile后端对象QSTile集合,这个集合在后续创建完整Tile对象时会用到. 具体创建哪些Tile则是通过获取配置在config.xml中的字段来决定了,具体过程可查看QSTileHost.onTuningChanged(String key, String newValue)方法


4.QSPanel类簇,该类簇包括的主要类如下,类图如下

image.png

image.png



packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
packages/SystemUI/src/com/android/systemui/qs/QSPanel#QSTileLayout
packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
packages/SystemUI/src/com/android/systemui/qs/PagedTileLayout.java

该类簇主要完成QS面板元素的动态添加,其中:

  • QSPanel : 对应我们前面说的QS面板,即二次展开面板,是该页面的顶层容器,其嵌套在一个ScrollView中. 负责动态添加相应的元素,添加的元素包括 [亮度条 / 根据屏幕方向动态添加开关容器 QSTileLayout / Footer ] 等. 同时为这些元素提供了一系列的操作接口,如
  • 为开关容器创建具体开关对象(通过QSHost) 并为其添加刷新监听器,在后续开关后端收到开关状态刷新需求时,将刷新需求分发到对应的开关视图层.
  • 开关详情页(Details)的创建与刷新
  • QS面板展开状态变化时做相应的处理(setExpanded(boolean expanded))
  • QuickQSPanel : 对应我们前面说的初级展开面板QQS面板,继承自QSPanel并对展示的Tile数做了限制(通过setMaxTiles(int)),同时复写了父类提供的添加子元素的方法,按需添加QQS面板的元素,因为QQS面板是QS面板的精简版,所以很多子元素未做添加
  • QSTileLayout : 开关容器接口,主要定义了开关容器绘制相关的接口
  • TileLayout : QQS面板开关容器类,负责精简QS面板的绘制,继承自 Viewgroup
  • PagedTileLayout : QS面板开关容器类,负责QS面板的绘制,继承自 ViewPager


5.QS类簇,该类簇包括的主要类如下,类图如下


image.png

image.png


packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java


该类簇主要作为整个QS面板的顶层容器,主要处理QS面板的展开/收起逻辑,其中:


  • QS : 接口,主要定义了 QS 面板展开/收起相关的接口
  • QSFragment : 继承自 Fragment,实现了 QS 接口,主要负责接收 QS 面板展开/收起状态的改变,并将最新状态同步给该 Fragment 中的 View 元素,如 QSContainerImpl
  • QSContainerImpl : 添加到QSFragment中的自定义 View,继承自FrameLayout对应布局qs_panel.xml,主要通过接收来自 QSFragment 的面板展开/收起状态的变化并做刷新

至此,整个QS面板中的关键类就介绍完了,下面将通过几条主线来洞悉整个QS面板的具体实现:

  • QS面板开关集合构建流程
  • Tile后端是如何与Tile视图层产生联系的
  • Tile的一次点击事件背后的流程是怎么样的
相关文章
|
5月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
279 2
|
6月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
1002 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
490 1
|
Android开发 Docker 容器
docker中编译android aosp源码,出现Build sandboxing disabled due to nsjail error
在使用Docker编译Android AOSP源码时,如果遇到"Build sandboxing disabled due to nsjail error"的错误,可以通过在docker run命令中添加`--privileged`参数来解决权限不足的问题。
2244 1
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
1981 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
979 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
Android开发
我的Android 进阶修炼(1): AOSP源码根目录结构
本文介绍了AOSP源码的根目录结构,提供了基于MTK9269 Android 9.0源码的目录说明,帮助读者了解AOSP源码的组织方式和各目录的功能。
853 0
我的Android 进阶修炼(1): AOSP源码根目录结构
|
开发工具 Android开发 git
全志H713 Android 11 :给AOSP源码,新增一个Product
本文介绍了在全志H713 Android 11平台上新增名为myboard的产品的步骤,包括创建新的device目录、编辑配置文件、新增内核配置、记录差异列表以及编译kernel和Android系统的详细过程。
946 0
|
Ubuntu 开发工具 Android开发
Repo下载、编译AOSP源码:基于Ubuntu 21.04,android-12.1.0_r27
文章记录了作者在Ubuntu 21.04服务器上配置环境、下载并编译基于Android 12.1.0_r27版本的AOSP源码的过程,包括解决编译过程中遇到的问题和错误处理方法。
940 0

热门文章

最新文章