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

手把手教你用Kokoro-82M-v1.1-zh搭建本地TTS服务(含WebSocket接口)

本文详细介绍了如何使用Kokoro-82M-v1.1-zh模型搭建本地TTS服务,包括环境配置、模型部署、WebSocket接口实现及性能优化。通过实战指南,开发者可以快速掌握本地部署TTS系统的关键技术,提升语音交互应用的开发效率。

weixin_30776273的博客 183

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

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

lzc739276918的专栏 1540

缺陷检测:使用PatchCore训练自己的数据集

必须包含有训练图片(无缺陷图片)、测试图片(缺陷图片)和ground_truth,并且ground_truth必须与对应图片的名称相同。同上一篇结果一样,我的输出为原始图片大小,但是不知道是不是因为图片不是正方形的,导致训练结果不好。编写一个脚本,重新规划数据集的路径规则,但是我稍微写复杂了一点,使用了类来操作。第二种(复杂):编写一个自己的Dataset,参考。第一种(简单):将数据集路径规则改成项目中。返回的必须是一个字典类型,可以阅读。本人此次使用的是第一种方法。运行时,参数部分直接输入。

xiaoxTai的博客 6480

LabVIEW Modbus通讯实战:从安装库到读写寄存器的完整避坑指南

本文详细介绍了LabVIEW与Modbus通讯的完整实战指南,从安装库文件到读写寄存器的全流程操作,帮助开发者避开常见问题。通过虚拟串口配置、主机配置实战和高级调试技巧,提升工业自动化领域的通讯效率与可靠性。

milk8的博客 740

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万+

YOLOv8【第二章:卷积创新篇·第23节】一文搞懂,Transformer与卷积混合架构!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读!

**My Coding Family** 1388

qstitle 快速设置

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

拒绝背八股文 687

innovus:如何在init design之后新增参考库(lib/lef)

如题,在PR过程中经常会遇到这种问题,时序无法收敛,需要新增一套lvt或者hpc的库,怎么办?

m0_61544122的博客 5010

杰理 JL701N/JL703N USB MIDI 使用教程

摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。

qq_42014563的博客 1267

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

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

qq_27799457的博客 1551

从零开始学习CANoe(十六)—— Graphics

Graphics是一种以时间轴为横坐标,符号值为纵坐标的显示分析方法,相对于Trace来说,更直观的观察出信号的跳变

蚂蚁小兵 9194

AndroidN SystemUI新增小图标

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

azhengye的专栏 2495

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

u010345983的博客 5201

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SystemUI修改定制

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

1516

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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、付费专栏及课程。

余额充值