问题:Android12 中SystemUI版本,QS下拉快捷面板式没有截屏功能的。
需求:客户要求在项目中实现下拉快捷面板具备一键截屏功能目前自己只针对Android12 mtk/RK平台实践过,接触的全志平台暂未实验验证。
文章目录
- 前言
- 一、实际实现效果
- 二、修改点
-
- 1.新增文件
- 2.修改文件
- 三、基础知识储备
-
- 基础知识内容了解
- 相关资料参考:
-
- 谷歌开源项目,SystemUI基础必备
- 其它文章推荐
- 源码查询平台
- 四、需求实现
- 五、总结
- 六、源码资料
前言
Android12 中在SystemUI的QS面板添加截屏功能按钮,目前在RK和mtk 平台验证过,实现步骤基本一致
一、实际实现效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9577a485e11a404b8e1adfe2c86384a3.png
视频效果如下
Android12 SystemUI新增截屏功能
二、修改点
1.新增文件
packages\apps\SystemUI\src\com\android\systemui\qs\tiles\ScreenShotTile.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\ScreenShotController.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\ScreenShotControllerImpl.java
packages\apps\SystemUI\res\drawable\ic_screenshot.xml
2.修改文件
packages\apps\SystemUI\src\com\android\systemui\qs\tileimpl\QSFactoryImpl.java
packages\apps\SystemUI\src\com\android\systemui\statusbar\policy\dragger\StatusBarPolicyModule.java
packages\apps\SystemUI\res\values\config.xml
具体代码实现,可以在文章末尾下载源代码,查看具体修改
三、基础知识储备
我从个人角度从零到1过程中,特别对于刚入手SystemUI,对SystemUI内容、架构、布局不熟悉的同学,更要针对SystemUI基本知识充电了解。方便当前需求实现和后续相关功能的定制和需求实现。
基础知识内容了解
SystemUI是什么、SystemUI启动流程、SystemUI布局、SystemUI有哪些内容、SystemUI架构、SystemUI组件.
相关资料参考:
谷歌开源项目,SystemUI基础必备
谷歌安卓开源项目SystemUI Remind
谷歌安卓开源项目SystemUI doc文档
Dragger
Qs-Titles
以上官方资料其实介绍很详细了,看完后还是模棱两可很正常,建议多看几遍,品味品味流程,跟进代码。
下面是部分其它自己认为写的比较好的博客或者专题,可以借鉴看看。 建议多看几遍,理解更为透彻了,然后跟一下代码流程,收获会是巨大的。
其它文章推荐
SystemUI 架构分析
深入理解SystemUI
SystemUI下拉框自定义(Android9.0)
SystemUI栏目(MTK平台)
SystemUI专题一
SystemUI专题二
源码查询平台
SystemUI源码查询
四、需求实现
从三中的相关基础准备,思路其实都很清晰了的,下面是我自己思路相关,来实现这个需求。
在QS面板中,已经有现成的功能,比如投屏功能,那么我们找到投屏相关代码和分析的流程来实现需求就可以了。
这里涉及到几个类:
- QSFactoryImpl:在 SystemUI 中,QSFacturer 工厂的仅有一个实现,即QSFactoryImpl中的默认工厂 ( ) CurrentTilesInteractorImpl
- QSTileImpl:抽象实现QSTile,为所有图块提供基本的通用行为。还为不同类型的实现扩展Icon。当前在 SystemUI 子类中定义的所有图块均来自此实现。
下面先分析投屏的部分代码
继承QSTileImpl
/** Quick settings tile: Cast **/
public class CastTile extends QSTileImpl<BooleanState> {
创建的地方
private final Provider<CastTile> mCastTileProvider;
....
@Inject
public QSFactoryImpl(
.....
Provider<CastTile> castTileProvider,
...
) {
mCastTileProvider = castTileProvider;
}
private QSTileImpl createTileInternal(String tileSpec)