先看下问题的表现情况吧


这个模块的实现在SystemUI
这里先列举下与这个模块以及本文要描述的相关代码和资源文件,后面逐个分析

SystemUI/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragment.java
SystemUI/res/layout/status_bar.xml
SystemUI/res/layout/heads_up_status_bar_layout.xml
SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java
SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java

  • CollapsedStatusBarFragment.java
    @Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,Bundle savedInstanceState) {// 1.1-就是这里加载了状态栏的布局xml: status_bar.xml    return inflater.inflate(R.layout.status_bar, container, false);}....../** Initializes views related to the notification icon area. */public void initNotificationIconArea() {// 1.2-这里初始化屏幕显示是左边部分的通知区域,所使用的布局下面2.2会做展示介绍// 注意:这里的布局不是本文问题所说的悬浮通知时状态栏所显示的该通知的图标和应用名的信息,那个布局后面说ViewGroup notificationIconArea = mStatusBar.findViewById(R.id.notification_icon_area);......}

注意,这个类主要是状态栏布局的跟xml的绑定和初始化,initNotificationIconArea 做的呢,也只是没有悬浮/横幅通知时,左边静态展示的那些通知的布局的绑定初始化

然后一开始会思考,当悬浮/横幅通知来的时候,状态栏显示一会就消失的通知图标加应用名信息是不是通过对这里的布局做一个动态的控制呢?
其实不是的,当悬浮/横幅通知来的时候,特有的状态栏通知信息(应用图标+名称)是有单独布局实现的

  • status_bar.xml
    <LinearLayout android:id="@+id/status_bar_contents"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingStart="@dimen/status_bar_padding_start"android:paddingEnd="@dimen/status_bar_padding_end"android:paddingTop="@dimen/status_bar_padding_top"android:orientation="horizontal"><FrameLayoutandroid:layout_height="match_parent"android:layout_width="0dp"android:layout_weight="1"><include layout="@layout/heads_up_status_bar_layout" /><!-- The alpha of the left side is controlled by PhoneStatusBarTransitions, and theindividual views are controlled by StatusBarManager disable flags DISABLE_CLOCK andDISABLE_NOTIFICATION_ICONS, respectively --><LinearLayoutandroid:id="@+id/status_bar_left_side"android:layout_height="match_parent"android:layout_width="match_parent"android:clipChildren="false">......// 2.2-这里就是上面initNotificationIconArea里注释1.2部分所说的xml布局,// 这个布局是非悬浮/横幅 通知时左边静态的通知图标的布局容器,具体的内容网上相关内容很多,这里不再做缀诉<com.android.systemui.statusbar.AlphaOptimizedFrameLayoutandroid:id="@+id/notification_icon_area"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:orientation="horizontal"android:clipChildren="false"/></LinearLayout></FrameLayout>

那么问题来了,那悬浮/横幅通知时,左上角的通知显示区域的布局在哪里呢?

<include layout=“@layout/heads_up_status_bar_layout” />
仔细看上面status_bar.xml,就在里面,这个布局就是悬浮/横幅通知来的时候,状态栏的特有通知的显示布局

  • heads_up_status_bar_layout.xml
    先看布局文件
<com.android.systemui.statusbar.HeadsUpStatusBarViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:visibility="invisible"android:id="@+id/heads_up_status_bar_view"android:alpha="0"><!-- This is a space just used as a layout and it's not actually displaying anything. We'rerepositioning the statusbar icon to the position where this is laid out when showing thisview. --><Spaceandroid:id="@+id/icon_placeholder"android:layout_width="@dimen/status_bar_icon_drawing_size"android:layout_height="@dimen/status_bar_icon_drawing_size"android:layout_gravity="center_vertical"/><TextViewandroid:id="@+id/text"android:textAppearance="@style/TextAppearance.HeadsUpStatusBarText"android:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="marquee"android:fadingEdge="horizontal"android:textAlignment="viewStart"android:paddingStart="6dp"android:layout_weight="1"android:layout_gravity="center_vertical"/>
</com.android.systemui.statusbar.HeadsUpStatusBarView>

左边的space 作为一个占位控件,用来存放应用图标icon ,下面的TextView 当然就是用来显示应用名称

然后,经过上面的梳理,既然悬浮/横幅通知的显示控件资源已经清晰了,那么控制显示,绑定数据的代码逻辑在哪里呢?

  • HeadsUpAppearanceController.java
    public HeadsUpAppearanceController(NotificationIconAreaController notificationIconAreaController,HeadsUpManagerPhone headsUpManager,NotificationStackScrollLayoutController notificationStackScrollLayoutController,SysuiStatusBarStateController statusBarStateController,KeyguardBypassController keyguardBypassController,KeyguardStateController keyguardStateController,NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue,NotificationPanelViewController notificationPanelViewController, View statusBarView) {this(notificationIconAreaController, headsUpManager, statusBarStateController,keyguardBypassController, wakeUpCoordinator, keyguardStateController,commandQueue, notificationStackScrollLayoutController,notificationPanelViewController,// 3.1-下面的R.id.heads_up_status_bar_view 控件即上面的heads_up_status_bar_layout.xml// R.id.heads_up_status_bar_view 是 heads_up_status_bar_layout.xml根布局的资源idstatusBarView.findViewById(R.id.heads_up_status_bar_view),statusBarView.findViewById(R.id.clock),statusBarView.findViewById(R.id.operator_name_frame),statusBarView.findViewById(R.id.centered_icon_area));}
    // 3.2-这个方法实现处理状态栏的数据绑定和显示private void updateTopEntry() {NotificationEntry newEntry = null;if (shouldBeVisible()) {newEntry = mHeadsUpManager.getTopEntry();}NotificationEntry previousEntry = mHeadsUpStatusBarView.getShowingEntry();mHeadsUpStatusBarView.setEntry(newEntry);if (newEntry != previousEntry) {boolean animateIsolation = false;if (newEntry == null) {// no heads up anymore, lets start the disappear animationsetShown(false);animateIsolation = !mIsExpanded;} else if (previousEntry == null) {// We now have a headsUp and didn't have one before. Let's start the disappear// animationsetShown(true);animateIsolation = !mIsExpanded;}// 3.3-这个方法主要是获取显示icon的位置,数据存储在Rect对象中,// 简单来说就是测量占位坑的位置信息,然后把icon精准投进去updateIsolatedIconLocation(false /* requireUpdate */);// 3.4-这里是处理显示的逻辑mNotificationIconAreaController.showIconIsolated(newEntry == null ? null: newEntry.getIcons().getStatusBarIcon(), animateIsolation);}}

针对showIconIsolated()方法的处理流程做个总结

 // src/com/android/systemui/statusbar/phone/NotificationIconAreaController.javapublic void showIconIsolated(StatusBarIconView icon, boolean animated) {mNotificationIcons.showIconIsolated(icon, animated);}// src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.javaprivate void updateTopEntry() {......if (newEntry != previousEntry) {......updateIsolatedIconLocation(false /* requireUpdate */);mNotificationIconAreaController.showIconIsolated(newEntry == null ? null: newEntry.getIcons().getStatusBarIcon(), animateIsolation);}}// src/com/android/systemui/statusbar/phone/NotificationIconContainer.javapublic void showIconIsolated(StatusBarIconView icon, boolean animated) {if (animated) {mIsolatedIconForAnimation = icon != null ? icon : mIsolatedIcon;}mIsolatedIcon = icon;updateState();}

后续的逻辑基本就是针对icon的一系列的间距和偏移的计算啥的,一开始觉得问题可能出在这块,但是这块是原生的逻辑,同时也是适用于静态状态栏的通知图标的。期间也尝试修改一些数值,做了测试,无果!

最后本着 在最小影响范围内解决问题,将目光继续聚焦于heads_up_status_bar_layout.xml这个布局文件,修改如下

<com.android.systemui.statusbar.HeadsUpStatusBarViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_height="match_parent"android:layout_width="match_parent"android:visibility="invisible"android:orientation="horizontal"android:id="@+id/heads_up_status_bar_view"android:alpha="0"
><!-- This is a space just used as a layout and it's not actually displaying anything. We'rerepositioning the statusbar icon to the position where this is laid out when showing thisview. --><Spaceandroid:id="@+id/icon_placeholder"android:layout_width="@dimen/status_bar_icon_drawing_size"android:layout_height="@dimen/status_bar_icon_drawing_size"android:layout_marginLeft="16dp"android:layout_gravity="center_vertical"/><!-- <TextViewandroid:id="@+id/text"android:textAppearance="@style/TextAppearance.HeadsUpStatusBarText"android:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"android:ellipsize="marquee"android:fadingEdge="horizontal"android:textAlignment="viewStart"android:paddingStart="6dp"android:layout_weight="1"android:layout_gravity="center_vertical"/> --><TextViewandroid:id="@+id/text"android:textAppearance="@style/TextAppearance.HeadsUpStatusBarText"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="6dp"android:singleLine="true"android:ellipsize="marquee"android:fadingEdge="horizontal"android:layout_gravity="center_vertical"/></com.android.systemui.statusbar.HeadsUpStatusBarView>

至此,问题解决!

Android 12 悬浮通知/横幅通知状态栏应用图标显示不全相关推荐

  1. Android 12.0Launcher3 电话和短信app图标显示未读短信和未接来电的条数

    1.概述 在12.0产品开发中,最近客户有需求要求在电话app图标显示未接来电的条数 在短信app图标上显示未读信息的条数 根据需求首选要在Launcher3的Launcher.java中,启动lau ...

  2. Android SystemUI 状态栏网络图标显示分析(Android 11)

    最近看了一个wifi, ethernet切换,状态栏图表显示的问题.记录一下追踪由于网络状态变化,SystemUI 状态栏网络图标显示的流程. 先看一下SystemUI这边: /frameworks/ ...

  3. android圆形图标显示不全,android 桌面图标显示不全

    android 图标显示不全的现象,分析代码和配置文件如下操作可以解决问题 Workspace.java 文件 cellCountX = 1; while (CellLayout.widthInPor ...

  4. 仿微信悬浮通知栏/横幅通知

    微信或者知乎推送消息的时候总会出现下面的效果: 也许很多人会说这是一个NotifiCation,看起来确实是的,按照思路走下去,所有的信息都将我们指向了setFullScreenIntent这个方法, ...

  5. android 在状态栏耳机图标显示图标显示图标显示图标,Android 通知栏图标

    先来一段发送普通通知的代码. NotificationManager notificationManager = (NotificationManager) getActivity().getSyst ...

  6. Android 11.0 12.0Launcher3 电话和短信app图标显示未读短信和未接来电的条数

    在11.0 12.0产品开发中,最近客户有需求要求在电话app图标显示未接来电的条数 在短信app图标上显示未读信息的条数 根据需求首选要在Launcher3的Launcher.java中,启动lau ...

  7. Android4.4 状态栏WiFi图标显示流程

    1. 状态栏信号图标 1.1 WIFI信号显示 WIFI信号在状态栏的显示如下图所示 当WiFi状态为关闭时,状态栏不会有任何显示.当WiFi状态打开时,会如上图所示,左侧表示有可用WiFi,右侧表示 ...

  8. android webview 网页图片加载不出来、显示不全、进入某页面退出,h5页面滑不了,点不了等功能异常等问题集锦

    在我们的android开发中,难免会嵌套一些h5页面在APP中,固然是减轻了开发者的负担,但也容易遇到一些很奇怪的问题. 一.网页图片加载不出来 此前笔者公司由于h5网页链接频繁被劫持篡改(链接被篡改 ...

  9. Android-仿QQ/微信-全局新消息提示 仿微信悬浮通知栏/横幅通知

    private WindowManager wm;private boolean showWm = true;//默认是应该显示悬浮通知栏private WindowManager.LayoutPar ...

最新文章

  1. 分治——最近点对问题 hdu1007
  2. 推荐十一个吊炸天的AI学习项目
  3. css预编译其器,CSS预处理器之——Less
  4. P3242 [HNOI2015] 接水果(整体二分、扫描线)
  5. python处理svg 平移 旋转_svg rotate 怎么转化平移和旋转两个参数。
  6. 由浅入深逐步了解 Synchronized
  7. arm poky linux,Solved: Re: arm-poky-linux - NXP Community
  8. 图像相似度算法--SIFT算法详解
  9. 群晖NAS跨存储空间移动套件(应用)
  10. 缓存投毒 -- 学习笔记
  11. Sklearn常用数据预处理方法介绍
  12. [整站源码]thinkphp家纺针织床上用品类网站模板+前后端源码
  13. JS之删除数组中的元素
  14. RAB与RB的关系详解
  15. 网络空间开源威胁情报分析的人机优化策略研究
  16. 每日TED What we don't understand about trust
  17. C语言学习记录——팔 函数和递归(1)
  18. PSH还有各种要补的天坑2
  19. 计算机组成原理寄存推实验报告,计算机组成原理移位寄存实验报告.doc
  20. Camstar 大数据之数据处理

热门文章

  1. django 静态 html页面,Django模板:HTML静态模板的继承
  2. Linux实战:awl-2.0工具模拟洪水攻击,建立大量的TCP连接
  3. 在小县城做什么生意好?
  4. 美团智能支付稳定性测试实战
  5. Apache的域名配置
  6. windows四种编码方式
  7. 老板喜欢提拔什么样的员工
  8. 1024Studio官网
  9. CAD数据文件格式DXF部分实体(圆弧、椭圆、凸度)解析[原理讲解+公式推导+java实现]
  10. facebook第三方登录前后端分离