您的位置:首页 > 数码常识数码常识

Android5.0版本说明(Androidbar)

2025-05-11人已围观

Android5.0版本说明(Androidbar)
  引言自 Android 5.0 版本,Android 带来了沉浸式系统 bar(状态栏和导航栏),Android 的视觉效果进一步提高,各大 app 厂商也在大多数场景上使用沉浸式效果。但由于 Android 碎片化比较严重,每个版本的系统 bar 效果可能会有所差异,导致开发者往往需要进行兼容适配。为了简化系统 bar 沉浸式的使用,以及统一机型、版本差异所造成的效果差异,本文将介绍系统 bar 的组成以及沉浸式适配方案。

  Androidbar引言

  背景问题一:沉浸式下无法设置背景色

  对于大于等于 Android 5.0 版本的系统,在 Activity 的 onCreate 时,通过给 window 设置属性:

  即可开启沉浸式系统 bar,效果如下:

  Android 5.0 沉浸式状态栏

  Android 5.0 沉浸式导航栏

  但是设置沉浸式之后,原来通过 window.statusBarColor 和 window.statusBarColor 设置的颜色也不可用,也就是说不支持自定义半透明系统 bar 的颜色。

  问题二:无法全透明导航栏

  系统默认的状态栏和导航栏都有一个半透明的蒙层,虽然不支持设置颜色,但通过设置以下代码,可让状态栏变为全透明:

  效果如下:

  Android 10.0 沉浸式全透明状态栏

  通过类似的方式尝试将导航栏设置为全透明:

  但发现导航栏半透明背景依然无法去掉:

  问题三:亮色系统 bar 版本差异

  对于大于等于 Android 6.0 版本的系统,如果背景是浅色的,可通过设置状态栏和导航栏文字颜色为深色,也就是导航栏和状态栏为浅色(只有 Android 8.0 及以上才支持导航栏文字颜色修改):

  效果如下:

  Android 8.0 亮色状态栏

  Android 8.0 亮色导航栏

  但是在亮色系统 bar 基础上开启沉浸式后,在 8.0 至 9.0 系统中,导航栏深色导航 icon 不生效,而 10.0 以上版本能显示深色导航 icon:

  Android 8.0 亮色沉浸式亮色导航栏

  Android 10.0 亮色沉浸式亮色导航栏

  问题分析问题一:沉浸式下无法设置背景色

  查看源码发现设置状态栏和导航栏背景颜色时,是不能为沉浸式的:

  问题二:无法全透明导航栏

  当设置导航栏为透明色(Color.TRANSPARENT)时,导航栏会变成半透明,当设置其他颜色,则是正常的,例如设置颜色为 0x700F7FFF,显示效果如下:

  Android 10.0 沉浸式导航栏

  为什么会出现这个情况呢,通过调试进入源码,发现 activity 的 onApplyThemeResource 方法中有一个逻辑:

  也就是说如果设置的导航栏颜色为 0(纯透明)时,将会为其修改为内置的颜色:ActivityTaskDescription_colorPrimary,因此就会出现灰色蒙层效果。

  问题三:亮色系统 bar 版本差异

  通过查看源码发现,与设置状态栏和导航栏背景颜色类似,设置导航栏 icon 颜色也是不能为沉浸式:

  解决沉浸式兼容性问题

  对于问题二无法全透明导航栏,由上述问题分析中的代码可以看出,当且仅当设置的导航栏颜色为纯透明时(0),才会置换为半透明的蒙层。那么,我们可以将纯透明这种情况修改颜色为 0x01000000,这样也能达到接近纯透明的效果:

  对于问题一,难以通过常规方式进行沉浸式下的系统 bar 背景颜色设置。而对于问题三,通过常规方式需要分别对各个版本进行适配,对于国内手机来说,适配难度更大。

  为了解决兼容性问题,以及更好的管理状态栏和导航栏,我们是否能自己实现状态栏和导航栏的背景 View 呢?

  通过 Layout Inspector 可以看出,导航栏和状态栏本质上也是一个 view:

  在 activity 创建的时候,会创建两个 view(navigationBarBackground 和 statusBarBackground),将其加到 decorView 中,从而可以控制状态栏的颜色。那么,是否能把系统的这两个 view 隐藏起来,替换成自定义的 view 呢?

  因此,为了提高兼容性,以及更好的管理状态栏和导航栏,我们可以将系统的 navigationBarBackground 和 statusBarBackground 隐藏起来,替换成自定义的 view,而不再通过 FLAG_TRANSLUCENT_STATUS 和 FLAG_TRANSLUCENT_NAVIGATION 来设置。

  实现沉浸式状态栏添加自定义的状态栏。通过创建一个 view ,让其高度等于状态栏的高度,并将其添加到 decorView 中:

  隐藏系统的状态栏。由于 activity 在 onCreate 时,并没有创建状态栏的 view(statusBarBackground),因此无法直接将其隐藏。这里可以通过对 decorView 添加 OnHierarchyChangeListener 监听来捕获到 statusBarBackground:

  注意:这里将 child 的 scaleX 设为 0 即可将其隐藏起来,那么为什么不能设置 visibility 为 GONE 呢?这是因为后续在应用主题时(onApplyThemeResource),系统会将 visibility 又重新设置为 VISIBLE。

  隐藏之后,半透明的状态栏不显示,但是顶部会出现空白:

  通过 Layout Inspector 发现,decorView 的第一个元素(内容 view )会存在一个 padding:

  因此,可以通过设置 paddingTop 为 0 将其去除:

  注意:这里需要监听 view 的 layout 变化,否则只有一开始设置则后面又被修改了。

  实现沉浸式导航栏

  导航栏的自定义与状态栏类似,不过会存在一些差异。先创建一个自定义 view 将其添加到 decorView 中,然后把原来系统的 navigationBarBackground 隐藏:

  注意:这里 onChildViewAdded 方法中,因为只能设置一次 OnHierarchyChangeListener ,需要同时考虑状态栏和导航栏。

  通过这个方式,能将导航栏替换为自定义的 view ,但是存在一个问题,由于 navigationBarHeight 是固定的,如果用户切换了导航栏的样式,再回到 app 时,导航栏的高度不会重新调整。为了让导航栏看的清楚,设置其颜色为 0x7F00FF7F:

  从图中可以看出,导航栏切换之后高度没有发生变化。为了解决这个问题,需要通过对 navigationBarBackground 设置 OnLayoutChangeListener 来监听导航栏高度的变化,并通过 liveData 关联到 view 中,代码实现如下:

  通过上面方式,可以解决切换导航栏样式后自定义的导航栏高度问题:

  完整代码

  扩展对话框适配

  有时候需要通过 Dialog 来显示一个提示对话框、loading 对话框等,当显示一个对话框时,即使设置了 activity 为深色状态栏和导航栏文字颜色,这时候状态栏和导航栏的文字颜色又变成白色,如下所示:

  这是因为对 activity 设置的状态栏和导航栏颜色是作用 于 activity 的 window,而 dialog 和 activity 不是同一个 window,因此 dialog 也需要单独设置。

  完整代码

  效果如下:

  快速使用Activity 沉浸式

  Dialog 沉浸式

  Demo 效果

  可实现与 iOS 类似的页面沉浸式导航条效果:

  加入我们

  我们是字节跳动影像团队,目前研发包括剪映、CapCut、轻颜、醒图、Faceu 在内的多款产品,业务覆盖多元化影像创作场景,截止 2021 年 6 月,剪映、轻颜相机、CapCut 等多次登顶国内外 APP Store 免费应用榜第一,并继续保持高速增长。加入我们,一起打造全球最受用户欢迎的影像创作产品。

  社招投递链接:https://job.toutiao.com/s/NFYMcaq

  校招投递链接:https://job.toutiao.com/s/NkecFwb

  了解更多岗位详情 https://bytedance.feishu.cn/docx/doxcnMxgSioztbDuQqZ3eWDAvMc

  上面就是小居数码小编今天给大家介绍的关于(Androidbar)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。

  94%的朋友还想知道的:

  怎么将cad版本转换成别的版本(cad怎样转换版本)

  cad版本过高教你降低版本方法(cad版本过高怎么转换低版本)

  浏览器更新版本新教程(浏览器怎么更新版本)

  mac电脑软件怎么更新(mac电脑怎么更新版本)



  152945
 

很赞哦! ()

随机图文