QSTile 的一点变化 Android O 与 Android N 相比

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

起因

Android O 点击QSPanel 中的数据图标没法展开详情查看数据使用量,而在Android N 上可以的,所以想调查看看O 上有什么不同。
注:本文不涉及任何流程分析,只是单纯的想找回个功能,并借此描述一下O 和N 在tile 上的一点点不同。

现象差异

我们都知道在Android N 上QSTile 有两种展示形式:

  1. QSPanel 半展开是点击icon 即开关,执行的方法为handleSecondaryClick();
  2. QSPanel 全展开时,点击icon 有些tile 有detai展示,比如下图中的wifi tile,此时执行的方法是handleClick(),之后调用showDetail() 方法显示详细信息;
    在这里插入图片描述
    在这里插入图片描述

但是到了Android O 上变的有点不一样了:

  1. 半展开时点击icon 和Android N 上效果一样,但执行的方法是handleClick();
  2. 全展开时有两种情况,点击icon还是开关,此时执行的方法也是handleClick();
  3. 全展开时点击label 会展示detail(如果有的话),有detail 的tile 在label 旁边会有一个indicator,而且注意观察的话,会发现点击icon 和点击label 水波纹的中心会不一样(如果没有detail 的话,点击label 也是上一种效果)。此时执行的方法是handleSecondaryClick()
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

那么Android O 上是怎么会有icon 和label 两种点击事件的呢?

Tile 布局

我们要想label 可以点击,那我们先看看这个indicator 是怎么回事,从布局看起。
找到几个和tile,layout 相关的类,并没有发现线索,直到在qs_tile_label.xml 中看到了下面的代码:

        <!-- tile label -->
        <TextView
            android:id="@+id/tile_label"
            ...
            android:textAppearance="@style/TextAppearance.QS.TileLabel"
            android:textColor="?android:attr/textColorPrimary"/>
        <!--  下面这个暂时不知道是做什么的 -->
        <ImageView android:id="@+id/restricted_padlock" 
            ...
            android:visibility="gone" />
        <!--  像是旁边的indicator,且默认不可见,怀疑是这个了 -->            
        <ImageView
            android:id="@+id/expand_indicator" 
            android:layout_marginStart="4dp"
            android:layout_width="18dp"
            android:layout_height="match_parent"
            android:src="@drawable/qs_dual_tile_caret"
            android:tint="?android:attr/textColorPrimary"
            android:visibility="gone" /> 

之后在QSTileView.java 类中找到使用的地方:

    protected void createLabel() {
        mLabelContainer = (ViewGroup) LayoutInflater.from(getContext())
                .inflate(R.layout.qs_tile_label, this, false);
        ...
        mExpandIndicator = mLabelContainer.findViewById(R.id.expand_indicator); // here
        mExpandSpace = mLabelContainer.findViewById(R.id.expand_space);

        addView(mLabelContainer);
    }

以及控制显示的地方

    @Override
    protected void handleStateChanged(QSTile.State state) {
        super.handleStateChanged(state);
        ...
        mExpandIndicator.setVisibility(state.dualTarget ? View.VISIBLE : View.GONE); // 显示与否依赖于 state.dualTarget
        mExpandSpace.setVisibility(state.dualTarget ? View.VISIBLE : View.GONE);
        mLabelContainer.setContentDescription(state.dualTarget ? state.dualLabelContentDescription
                : null);
        if (state.dualTarget != mLabelContainer.isClickable()) {
            mLabelContainer.setClickable(state.dualTarget); // 设置是否可以点击
            mLabelContainer.setLongClickable(state.dualTarget);
            mLabelContainer.setBackground(state.dualTarget ? newTileBackground() : null);
        }
        mLabel.setEnabled(!state.disabledByPolicy);
        mPadLock.setVisibility(state.disabledByPolicy ? View.VISIBLE : View.GONE);
    }

可以看到indicator 的显示受state.dualTarget 的控制。
考虑到另外也有几个可以展开detail 的tile,比如Bluetooth等,我猜想state.dualTarget 一定会在那几个tile 里面赋值为true。我们搜一下,果然:
在这里插入图片描述
那我们在CellularTile 对应的位置也给dualTarget 赋值为true 应该就能达到我们最初想要的效果了。

结论和效果

添加state.dualTarget = true; 到CellularTile.java 的handleUpdateState() 方法后,效果如下:
在这里插入图片描述

state.dualTarget 控制了是否显示indicator 以及label 是否可以点击,但点击有没有反应要看有没有实现相应的方法了。
点击mobile date 这里并不是凭空多出来一个功能哈,是我知道有这个功能,只是没显示出来。

注:文中代码基于mko-mr1,一个基于aosp 的android 8.1 分支。

Android 12 MTK SystemUI 下拉状态栏 UI定制化开发(1) 想要修改这块UI界面,需要梳理出整体流程是怎么过来,要不容易改乱了,大致下面三个类最关键:在UI定制化开发 (2) 系列中我会详细给大家梳理下布局结构,改哪些关键点,这几个类都是怎么联系上的! 阅读详情

相关推荐

Android13 SystemUI qs快捷设置布局分析

这张图显示了我们快捷设置QSTile布局的包含图,快捷设置是被包含到StatusBar中的,并且是被划分到NotificationShadeWindowView中

superjaingchao的专栏 2012

SystemUI之Qs Tile加载流程

Quick Settings行内人简称qs,是SystemUI必不可少的一部分。它主要负责打开关闭各个系统的功能模块,如wifi、蓝牙、手电筒等。 从图中可以看出,每一个系统功能都对应这一个按钮,而这个按钮的学名就是Tile。 正文 单个Ti...

2172

Android——快速设置Quick Settings Tile(创建自定义快速设置磁贴)

快速设置是显示在快速设置面板中的磁贴,表示操作,用户可以点击这些操作来快速完成重复出现的任务。你的应用可以通过TileService类为用户提供自定义的tile,并使用tile对象来跟踪tile的状态。例如,你可以创建一个标题,让用户打开或关闭应用程序提供的VPN。需要提供一个自定义图标,该图标显示在Quick Settings面板中的tile上(将在声明TileService时添加此图标)。图标必须是纯白色的透明背景,尺寸为24 x 24dp,并以的形式呈现。创建一个图标,在视觉上暗示你的标题的目的。

tracy的博客 5193

Android 8.1 中Systemui中的常见修改(七)QStile流程

研究QstileView的加载流程,可以方便后我们后续进行界面的定制化和相应的修改。本文仅仅简单的探究流程,当然我们也会发现好多的新知识。 一、在线代码地址: 分享一个在线看代码的地址: https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/src/com/android/sy...

xiangzaixiansheng的博客 3393

Android 11.0 SystemUI 状态栏下拉快捷面板,添加“反色“快捷开关

在quick_settings_tiles_default 中配置的快捷方式图标,是一次按顺序显示的,需要添加的"反色"快捷开关为inversion.如果有排列需要,则可以按要求放在需求的位置,现在我是直接添加到末尾.(2)"反色"功能的核心代码在ColorInversionTile中实现,现在需要将"反色"添加到QSFactoryImpl.java中,这样,点击快捷面板中"反色"快捷开关时,能实现开启和关闭反正功能.(1)在配制文件config.xml中,添加"反色"项的配置.二.涉及的核心代码路径。

Smile_729day的博客 1432

android 7.0 system UI之快速启动栏的分析(一)

作者:jason.chen  从状态栏往下拉的时候,就会出现“快速设置”界面,如下图所示。快速启动界面可以让用户快速设置和操作。对于急需或频繁使用的控件和操作,保留“快速设置”图块,且不应将其用作启动应用的快捷方式。android7.0添加了新的API,让开发者可以为自己的应用添加快速设置图标。这篇文件将要分析快速启动的设计。当然,只是个人见解。

maetelibom的博客 4481

QSTile自填加

就是在QSTileHost.java中的onTuningChanged()函数中,而这个函数调用实现是在TunerServiceImpl.java中的addTunable调用的,到这就可以结束了,这个onTuningChanged是通知。其中就发现该对象的添加数据对象是TileRecord这个类,响应事件应该是com.android.systemui.qs.QSPanel.QSTileLayout这个接口实现的,然后我们在返回去,查看是哪里的数据加载了这个界面。

MyDragonFly的博客 268

手把手解决GD32H759I-EVAL以太网通信三大坑:IP冲突、端口绑定失败、LWIP内存泄漏

本文针对GD32H759I-EVAL开发板在以太网通信调试中常见的三大难题——IP地址冲突、端口绑定失败和LWIP内存泄漏,提供了详细的实战排障指南。文章深入分析了问题根源,并给出了具体的网络配置、端口管理策略和内存泄漏检测方法,帮助开发者快速定位并解决嵌入式网络通信中的棘手问题,确保系统稳定运行。

weixin_29196315的博客 141

Android12.0 SystemUI Tile 布局横向转竖向修改

上面两处修改完后,编译出来的Tile就是上下布局的方式了,但还有一些细节的修改,例如文字不居中之类的 就需要修改packages/SystemUI/res/values/dimens.xml。另外如果还需要修改Icon的大小,需要修改对应qs_tile_height的大小。这里修改布局由HORIZONTAL变为VERTICAL 对齐方式改为居中。这里修改的是文字对齐方式,之前是左对齐,现在改为居中对齐。

lzc739276918的专栏 1540

generate for与always内for:Verilog循环的静态生成与动态执行之辨

本文深入解析Verilog中generate for与always内部for循环的核心差异。generate for使用genvar变量在编译时静态生成硬件结构,适用于模块实例化;always内部for使用整型变量在运行时动态执行,综合为并行逻辑。理解这两种循环的适用场景和综合结果对提升数字电路设计质量至关重要。

yog99的博客 1087

2026深度破解:OpenClaw开源AI框架架构与实战全景解析

2026年初,一款名为OpenClaw的开源AI Agent框架以惊人的速度席卷全球开发者社区,短短数周GitHub星标突破20万,成为史上增长最快的开源项目。本文从架构设计、核心原理、代码实现和工程实战四个维度,深度剖析OpenClaw的技术内核,帮助开发者从理解到实践,快速掌握这一革命性的AI开发框架。

fox0329的博客 2373

android 下拉状态栏(SystemUI)常见修改记录

摘要:下拉状态栏:1.下拉状态栏的亮度条:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.javamBrightnessView对应布局文件:quick_settings_brightness_dialog.xml2.滑动亮度条后过渡到桌面的亮度条frameworks/base/packages/Syste...

sdkdlwk的博客 3万+

YOLOv11改进策略【Neck】| SEAM:分离和增强注意模块,解决复杂场景下的小目标遮挡问题

本文记录的是利用 SEAM 模块优化 YOLOv11 的目标检测网络模型。的设计出发点在于解决复杂场景下的人脸遮挡问题,相当于是小目标被其他物体部分遮挡时,传统方法因特征缺失导致检测精度下降的问题。该模块通过增强未遮挡区域的特征响应并补偿被遮挡区域的信息损失,提升模型对遮挡小目标的检测能力。YOLO-FaceV2: A Scale and Occlusion Aware Face DetectorSEAM模块(Separated and Enhancement Attention Module)的设计出发点

Limiiiing的博客 2281

qstitle 快速设置

android/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java public QSTile<?> createTile(String tileSpec) { if (tileSpec.equals("wifi")) ...

拒绝背八股文 687

YOLO26改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 359

微信小程序开发:实现地图导航功能

其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。

吃不胖. 8922

【Android15】SystemUI下拉面板新增快捷设置Tile

本文介绍了在Android SystemUI中新增自定义快捷设置Tile的实现方法。首先需要继承QSTileImpl类创建CustomTile,实现点击事件和状态更新等核心功能。然后通过添加TILE_SPEC标识到config.xml配置文件中,并创建QSCustomModule进行依赖注入。最后将自定义模块添加到SystemUIModule中完成集成。

qq_27799457的博客 1551

AI使能的SVD算子:基于深度学习的矩阵分解方法

奇异值分解(Singular Value Decomposition, SVD)是线性代数中一种重要的矩阵分解方法,广泛应用于信号处理、数据降维、推荐系统等领域。传统SVD算法虽然精确,但在处理大规模矩阵时面临计算复杂度高、内存需求大等问题。本文提出了一种基于深度学习神经网络的SVD算子实现方法,完全摒弃传统数值算法,仅使用PyTorch框架构建的神经网络模型来完成大规模信道矩阵的SVD分解与还原。

huanghm88的专栏 1333

AndroidN SystemUI新增小图标

之前分析了SystemUI的主体视图,本篇来点干货,先分析快捷小图标的呈现过程,然后会我们自己新增一个快捷小图标。

azhengye的专栏 2495

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android13下拉状态栏QS面板的加载流程解析

很明显,调用 tunerService 里的 addTunabe() 方法,跟进去会发现,最终的是调用的 TunerServiceImpl 里面的 addTunabe() 方法。在这里,与Android 9.0及其以下版本实例化 QSTileHost类的方式不一样,这里是通dagger来实例化的。上述代码中第一次 tileList 为空,调用了 getDefaultSpecs(context) 获取字符串,该方法比较简单,这里就不做分析了。看到这里通过对应的字符串分别实例化了对应的 Tile。

u010345983的博客 5201

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SystemUI修改定制

源码默认下拉时只显示header和通知栏部分(见4中的图片),修改为下拉直接完全展开快捷设置面板,NotificationPanelView.java->isOpenQsEvent直接返回true即可。

1516

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android14中SystemUI下拉菜单中Tile中文字上下显示不完整bug整改

Android14中SystemUI下拉菜单中Tile中文字上下显示不完整bug整改,主要是对字体和间距进行了一系列的缩小,这样在设置Settings显示中无论设置字体显示多大多小,字体都能够完整的显示出来,针对不同型号的机子,对大小的要求也不同,需要灵活使用。

hey,欢迎浏览我的博客,希望能给你提供帮助。 742

SystemUI 创建 Tile 流程, 添加Tile

system UI预置的(QSTile),第三方应用添加的(CustiomTile  7.0 才有的) 一、 创建自定义的Tile   二、Tile加载流程 Tile中方法 handleClick() 短按 getLongClickIntent() 长按 handleUpdateState() 更新状态 handleSecondaryClick() 点击开关label显示详情页 getT...

2215

Android SystemUI QS模块

在\frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tile路径下创建一个类DesignNewTile.java!

weixin_44385574的博客 911

Android8.0 Do not disturb(DND)/Zenmode 添加一个新的模式

这里添加的模式可能涉及的地方不全面,目前把已知的地方都加上。可以搜索ZEN_MODE_ALARMS来看看哪里还需要加代码。目前就改了这些地方,有些地方不知道有什么用,可能只是log信息,有些是显示的图标,根据不同模式显示不同icon。 1.在QS中添加选项 打开关闭DND是在quick settings中的,当然也可以按音量下。我们这要在QS中添加,可以按照其他dnd模式来添加代码。 先...

Aaron121314的博客 8266
上一篇: ubuntu 18.04 编译android 8.1 问题记录
下一篇: Manjaro 配置Samba 共享文件夹给Windows 访问
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值